У меня есть следующий код:
find ./ -iname '*phpmyadmin' -exec rm -rf {} \;
Удаляет каталог с именем phpmyadmin
, но не удаляет файл с именемphpMyAdmin-Version-XYZ.zip
Даже если я удалю -rf
, он все равно не удалит его (вероятно, из-за второй проблемы с -iname, не влияющей на нечувствительность к регистру).
- Есть ли способ удалить любой inode в одном rm (файл, dir, softlink)?
- Почему добавление
-iname
не имеет эффекта?
Примечание: я не нашел аргумента "удалить любой inode" в man rm
.
find
поддерживает это, попробуйте-delete
действие. (Также см. Gnu.org/software/findutils/manual/html_node/find_html/… для подробного обсуждения многих способов сделать это неправильно.)Ответы:
Проблема в том, что вы сопоставляете файл, который заканчивается
phpmyadmin
( без учета регистра ) с использованием шаблона*phpmyadmin
. Чтобы получить любой файл, содержащий строкуphpmyadmin
(без учета регистра), используйте-iname '*phpmyadmin*'
:Возможно, получение подходящих файлов перед удалением было бы вменяемым:
Чтобы ответить на ваш первый вопрос,
rm
в пользовательском пространстве нет опции для работы с inode.источник
-depth
чтобыfind
не пытаться перейти в каталог, который он только что удалил.find
перед добавлением-exec
параметра. Очень опасно.-exec rm -rf {} +
- нет смысла снижать производительность при запуске по одномуrm
на файл.Это работает, даже если кто-то создает каталог -phpmyadmin.
источник
./
, так что в этом нет необходимости: он будет выполнятьсяrm -rf ./-phpmyadmin
, что должно работать с любым разумомrm
. Попробуйтеfind ./ -iname '*whatever*' -exec echo '{}' ';'
проверитьfind */
вместо этогоfind .
, он сделает это (если соответствующее имя каталога начинается с тире). Тем не менее, я , как правило, предлагаю использовать--
для обработки таких случаев, предоставляя Явные варианты в связи с прекращением , прежде чем в{}
аргументе. (См. № 10 в Руководстве по синтаксису утилит POSIX ).{} +
это значительно эффективнее{} \;
, поскольку он будет запускать только столько экземпляров вашей команды (nuke
в данном случае), сколько необходимо для размещения всех элементов, найденных в командной строке, а не по одному на каждый.find */
то проблема не возникнет-exec
, каталог с дефисом может оказатьсяfind
опцией, и он будет жаловаться.