Я случайно скопировал папки в своем Music
каталоге в родительский michal
каталог. Я хочу удалить эти каталоги одним махом.
Есть ли способ заставить это работать? Или есть лучшая альтернатива?
/home/michal/Music $ find . -type d -maxdepth 1 -exec rm -r ../{} \;
Очевидно, что {}
не заменяется, поскольку приведенное выше возвращает
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
rm: ../{}: No such file or directory
...
решение1
Ваша find
команда отлично работает у меня с GNU find
. Если она не работает на вашей системе, попробуйте:
find . -maxdepth 1 -type d -exec sh -c 'rm -r "../$1"' Rm {} \;
Этот подход использует {}
как независимый аргумент, не модифицированный ../
. Мы передаем значение в {}
оболочку, и оболочка применяет ../
.
Примечания:
Порядок
-maxdepth 1
и-type d
был изменен на обратный, посколькуman find
рекомендуется, чтобы глобальные параметры, такие как-maxdepth
, определялись до позиционных параметров, таких как-type
.Команда оболочки должна быть в одинарных кавычках:
'rm -r "../$1"'
. Если бы она была в двойных кавычках, исходная оболочка заменила бы ее значение на$1
, а имя каталога, найденное по ,find
было бы проигнорировано. Нам нужен вызываемый ,sh
чтобы выполнить замену. Строка"../$1"
заключена в двойные кавычки, чтобы защитить имя каталога ,$1
от разбиения на слова и расширения имени пути.Оболочка присваивает строку
Rm
.$0
Это не используется, если нет сообщения об ошибке. Следовательно, может использоваться любая строка.
решение2
С zsh
:
cd /home/michal &&
rm -rf -- Music/*(/D:t)
Квалификатор /
glob используется для выбора только каталогов, D
включая скрытые, а :t
модификатор like в history extension используется для выбора толькохвост(имя файла без указания каталога).
С любой оболочкой типа Bourne:
cd /home/michal/Music &&
set -- */ &&
cd .. &&
rm -rf -- "$@"
Однако одно из отличий от вышеприведенного варианта заключается в том, что он также будет включать символические ссылки на каталоги (и удалит содержимое цели вместо самой ссылки).