команда find: использование {} в пути

команда find: использование {} в пути

Я случайно скопировал папки в своем 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 {} \;

Этот подход использует {}как независимый аргумент, не модифицированный ../. Мы передаем значение в {}оболочку, и оболочка применяет ../.

Примечания:

  1. Порядок -maxdepth 1и -type dбыл изменен на обратный, поскольку man findрекомендуется, чтобы глобальные параметры, такие как -maxdepth, определялись до позиционных параметров, таких как -type.

  2. Команда оболочки должна быть в одинарных кавычках: 'rm -r "../$1"'. Если бы она была в двойных кавычках, исходная оболочка заменила бы ее значение на $1, а имя каталога, найденное по , findбыло бы проигнорировано. Нам нужен вызываемый , shчтобы выполнить замену. Строка "../$1"заключена в двойные кавычки, чтобы защитить имя каталога , $1от разбиения на слова и расширения имени пути.

  3. Оболочка присваивает строку 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 -- "$@"

Однако одно из отличий от вышеприведенного варианта заключается в том, что он также будет включать символические ссылки на каталоги (и удалит содержимое цели вместо самой ссылки).

Связанный контент