Как удалить папку, содержащую файл или папку с определенным именем?

Например, я хочу удалить все папки, которые содержат файл "things.txt":

/dirA/
/dirB/things.txt
/dirC/
/dirD/things.txt
/dirE/things.txt
/dirF/

Затем он удалит DIRB, DIRD и DIRE - не только файлы внутри.

Спасибо!

2 ответа2

1

Решением без передачи в другом месте было бы передать имя каталога в подоболочку в функции find exec .

Это будет не так эффективно, и, конечно, он попытается удалить несуществующие каталоги, если они уже были удалены.

find . -depth -type f -name 'things.txt' -exec sh -c 'rm -rf "$(dirname $0)"' {} \;

Если вы хотите использовать xargs , вы можете сделать это очень просто, вот так. Обратите внимание, что dirname принимает только один аргумент, поэтому вы должны указать -n 1 чтобы xargs передавал только один:

find . -depth -type f -name 'things.txt' | xargs -n 1 dirname | uniq | xargs rm -rf

Это не будет безопасно, если имя вашего каталога содержит символ новой строки, так что имейте это в виду.

0

Это было проверено в Linux, так как приведенные ниже команды также выполняются в системе Unix.

find -type f -name 'things.txt' | xargs dirname | xargs rm -r

Объяснение:

find -type f -name 'things.txt' -> поиск файла с именем 'things.txt' (только файл, а не каталог)

| -> передать результат следующей команде

xargs dirname | -> получить имя каталога, в котором находится файл, и передать результат следующей команде

xargs rm -r -> приступить к удалению всех этих каталогов, в которых находится файл с именем «things.txt»

Вуаля!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .