Copiei acidentalmente as pastas do meu Music
diretório para o michal
diretó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 find
comando 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:
A ordem de
-maxdepth 1
e-type d
foi invertida, poisman find
recomenda que opções globais, como-maxdepth
, sejam definidas antes de opções posicionais, como-type
.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 porfind
seria ignorado. Precisamos do chamadosh
para 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.O shell atribui a string
Rm
a$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, D
para incluir os ocultos, e o :t
modificador, 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).