find comando: usando {} em um caminho

1

Eu acidentalmente copiei as pastas no meu diretório Music para o diretório pai michal . Eu quero excluir esses diretórios de uma só vez.

Existe alguma maneira de fazer o seguinte trabalho? Ou existe uma alternativa melhor?

/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;

Evidentemente, o {} não está sendo substituído porque os retornos acima

rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...
    
por Michal Z. 27.09.2016 / 03:10

2 respostas

3

Seu comando find funciona bem para mim com o GNU find . Se não funcionar no seu sistema, tente:

find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;

Essa abordagem usa {} como um argumento independente, não modificado por ../ . Passamos o valor de {} para o shell e o shell aplica o ../ .

Notas:

  1. A ordem de -maxdepth 1 e -type d foi revertida, pois man find recomenda que opções globais, como -maxdepth , sejam definidas antes de opções posicionais como -type .

  2. O comando shell deve estar entre aspas simples: 'rm -r "../$1"' . Se estivesse entre aspas duplas, o shell de origem substituiria seu valor por $1 e o nome do diretório encontrado por find seria ignorado. Precisamos do chamado sh para fazer a substituição. A string "../$1" está entre aspas duplas para proteger o nome do diretório, $1 , contra a divisão de palavras e a expansão do nome do caminho.

  3. O shell atribui a string Rm a $0 . Isso não é usado, a menos que haja uma mensagem de erro. Consequentemente, qualquer string pode ser usada.

por 27.09.2016 / 04:10
0

com zsh :

cd /home/michal &&
rm -rf -- Music/*(/D:t)

O qualificador / glob é para selecionar somente diretórios, D para incluir os ocultos, e o modificador :t como na expansão do histórico é para selecionar apenas o final (o nome do arquivo sem sua parte de diretório).

Com qualquer shell parecido com o Bourne:

cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"

Uma diferença com o que foi dito acima é que ele também incluirá links simbólicos para os diretórios (e removeria o conteúdo do alvo em vez do próprio link).

    
por 21.10.2016 / 07:59

Tags