Comando find: usando {} em um caminho

Comando find: usando {} em um caminho

Copiei acidentalmente as pastas do meu Musicdiretório para o michaldiretório pai. Quero excluir esses diretórios de uma só vez.

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

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

Evidentemente o {}não está sendo substituído, pois o acima retorna

rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...

Responder1

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

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

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

Notas:

  1. A ordem de -maxdepth 1e -type dfoi invertida, pois man findrecomenda 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 $1e o nome do diretório encontrado por findseria ignorado. Precisamos do chamado shpara fazer a substituição. A string "../$1"está entre aspas duplas para proteger o nome do diretório, $1, contra divisão de palavras e expansão de nome de caminho.

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

Responder2

Com zsh:

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

O /qualificador glob serve para selecionar apenas diretórios, Dpara incluir os ocultos, e o :tmodificador, como na expansão do histórico, é para selecionar apenas os diretórioscauda(o nome do arquivo sem a parte do diretório).

Com qualquer shell do tipo Bourne:

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

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

informação relacionada