Remove tudo, exceto um arquivo e diretório no caminho

1

Eu preciso remover todos os arquivos em um diretório, exceto por um arquivo e uma pasta. Até o grep eu posso produzir a lista correta de itens que eu quero remover, mas quando eu adiciono xags, nada é deletado.

este é o comando que estou usando.

ls domain.com/wp-content/themes | grep -v -E 'twentyeleven|index.php'  | xargs rm -rf
    
por Sebastien 05.10.2011 / 09:08

2 respostas

0

você poderia resolver isso com mais alguns diagnósticos,

o comando funciona na prática, em um exemplo simples.

Então, tudo o que você precisa fazer é solucionar o problema.

Parece que você fez a solução de problemas ao ponto de encontrar ls domain.com/wp-content/themes | grep -v -E 'twentyeleven | index.php'
parece bom.

Tente ls file1 file2 file3 dentro desse diretório. | rm -rf

Tente echo file1 file2 file3 | rm -rf

Tente outro diretório, talvez haja algum problema com isso. A resolução de problemas básica irá levá-lo muito mais longe, possivelmente à solução.

Aqui está um exemplo que funciona. Testado no cygwin.

user@iar ~/aa
$ ls | grep -v -E "op"
er
qw
ty
ui

user@iar ~/aa
$ ls | grep -v -E "op" | xargs rm -rf

user@iar ~/aa
$ ls
op

user@iar ~/aa
$
    
por 05.10.2011 / 10:23
0

Primeiro de tudo, você quer usar ls -1 (número 1, não minúsculo L) se você quiser usar grep em sua saída.

Mas o principal problema é que você lista o conteúdo de um subdiretório, mas o comando rm é executado no diretório atual.

Por exemplo, veja esta árvore de diretórios ( . e .. entradas omitidas)

 a/
 a/x
 a/y
 a/z

Digamos que você queira remover todos do diretório a exceto o arquivo y e usar o comando conforme tentou:

 $ ls -1 a | grep -v 'y'  | xargs rm -rf

ls -1 a dá:

 x
 y
 z

grep filtra a linha com y :

 x
 z

so xargs excita o seguinte comando:

 rm x z

Mas ele executa o comando no diretório de nível superior e vê apenas o diretório a , não os arquivos x e z .

Para que isso funcione, você precisa do caminho dos arquivos - facilmente alcançado aplicando uma pequena alteração no comando ls . Também refinamos o padrão grep um pouco:

 ls -1d a/* | grep -v '/y$'  | xargs rm -rf

Então, desta vez, ls produz a seguinte saída:

 a/x
 a/y
 a/z

e o comando final executado seria rm -rf a/x a/z

Então, vamos voltar à sua linha de comando e aplicar as alterações discutidas:

 $ ls -1d domain.com/wp-content/themes/* | grep -v -E '/twentyeleven$|/index.php$'  | xargs rm -rf

Uma última nota: Usar xargs rm -rf é sempre arriscado (embora algumas vezes necessário) - certifique-se de verificar primeiro a saída do comando grep!

    
por 05.10.2011 / 15:49