Intereting Posts
Редактирование файлов с помощью сценария оболочки Как заставить терминатор отображать удаленное имя хоста в строке заголовка? Как заставить Samba использовать SMB 3.0? Как увидеть текущее значение переменных текущего процесса matlab в tmux? блокировка клавиатуры после удержания клавиши ctrl Как отключить автоматическое копирование выделения? Подтверждение того, что был создан обратный туннель ssh Может ли сценарий bash рассказать, какой каталог пользователь, когда он запускает скрипт? Команда Addgroup: не найдена Bash: Итерирование 2 списков с использованием одиночного цикла In In enp3s0: ссылка не готова Разница между адресом «Reply-to» и «От адреса в электронном письме» Пример пакета, который имеет одно и то же имя в двух разных дистрибутивах, но относится к несвязанным восходящим проектам для каждого? Блокируйте ввод пользователя на интерактивной оболочке с помощью «cat / dev / ttyS0» Как предотвратить arp-scan от записи в syslog?

Почему удаление каталогов генерирует сообщения об ошибках с помощью find -exec?

Почему это так:

find . -type d -name test -exec rm -r {} \; 

генерирует сообщения об ошибках:

 find: ./foo/test: No such file or directory find: ./bar/test: No such file or directory find: ./blech/test: No such file or directory 

даже если он фактически удаляет соответствующие каталоги?

Это с OS X (10.10).

Найти использует readdir() для получения содержимого из каталогов.

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

Существует чистое решение для вашей проблемы:

find . -depth ...

(замените … на остальную командную строку поиска)

скажет find чтобы обработать весь контент каталога до самого каталога.

BTW: Я рекомендую вам прочитать страницу поиска. С 26 лет существует лучшее решение, чем -exec ... {} \; так как это медленно и создает подпроцесс для каждого попадания. Ищите -exec ... {} + , так как он собирает имена путей до достижения максимального размера аргументов.

Оригинальный вопрос

Все слова после -exec до \; интерпретируются как параметры, т. е. они расширяются оболочкой, из которой вы запускаете команду (вы можете попробовать, что произойдет, если каталог с именем {} существует), но затем они интерпретируются как цитируемые. Вам нужна оболочка для расширения глобусов:

 find . -type d -exec bash -c 'echo {}/*' \; 

Обновить

При удалении каталогов после удаления родительского каталога вы больше не можете удалять своих детей – они исчезли.