Почему / rm -iname '* phpmyadmin' не удаляет phpMyAdmin-Version-XYZ.zip?

8

У меня есть следующий код:

find ./ -iname '*phpmyadmin' -exec rm -rf {} \;

Удаляет каталог с именем phpmyadmin, но не удаляет файл с именемphpMyAdmin-Version-XYZ.zip

Даже если я удалю -rf, он все равно не удалит его (вероятно, из-за второй проблемы с -iname, не влияющей на нечувствительность к регистру).

  1. Есть ли способ удалить любой inode в одном rm (файл, dir, softlink)?
  2. Почему добавление -inameне имеет эффекта?

Примечание: я не нашел аргумента "удалить любой inode" в man rm.

derobert
источник
1
Если ваш findподдерживает это, попробуйте -deleteдействие. (Также см. Gnu.org/software/findutils/manual/html_node/find_html/… для подробного обсуждения многих способов сделать это неправильно.)
zwol

Ответы:

31

Проблема в том, что вы сопоставляете файл, который заканчивается phpmyadmin( без учета регистра ) с использованием шаблона *phpmyadmin. Чтобы получить любой файл, содержащий строку phpmyadmin(без учета регистра), используйте -iname '*phpmyadmin*':

find ./ -iname '*phpmyadmin*' -exec rm -rf {} \;

Возможно, получение подходящих файлов перед удалением было бы вменяемым:

find ./ -iname '*phpmyadmin*'

Чтобы ответить на ваш первый вопрос, rmв пользовательском пространстве нет опции для работы с inode.

heemayl
источник
1
Вполне возможно, следует учитывать, -depthчтобы findне пытаться перейти в каталог, который он только что удалил.
roaima
8
Не брать ничего от ответа, который включает это, но просто хотел подчеркнуть, что причина, по которой команда OP не удалила zip-файл, заключалась в том, что он не нашел его из-за отсутствия завершающего символа * на шаблон.
Гвин Эванс
3
@GwynEvans Это также означает, что OP не проверял findперед добавлением -execпараметра. Очень опасно.
Тулаинс Кордова
Могу предложить -exec rm -rf {} +- нет смысла снижать производительность при запуске по одному rmна файл.
Чарльз Даффи
2
find ./ -iname '*phpmyadmin*' -exec /usr/lib/klibc/bin/nuke {} +

Это работает, даже если кто-то создает каталог -phpmyadmin.

Джошуа
источник
Find (по крайней мере, здесь) ставит перед именами префиксы ./, так что в этом нет необходимости: он будет выполняться rm -rf ./-phpmyadmin, что должно работать с любым разумом rm. Попробуйте find ./ -iname '*whatever*' -exec echo '{}' ';'проверить
Дероберт
@derobert: у меня это напортачило в нескольких случаях. Идиома: обжегся на молоке - дует на воду. Возможно, это может произойти только в том случае, если аргумент для поиска является чем-то вроде '-annoyingdirectoryname'.
Джошуа
1
Если кто-то запустит, скажем, find */вместо этого find ., он сделает это (если соответствующее имя каталога начинается с тире). Тем не менее, я , как правило, предлагаю использовать --для обработки таких случаев, предоставляя Явные варианты в связи с прекращением , прежде чем в {}аргументе. (См. № 10 в Руководстве по синтаксису утилит POSIX ).
Чарльз Даффи
1
Кроме того, {} +это значительно эффективнее {} \;, поскольку он будет запускать только столько экземпляров вашей команды ( nukeв данном случае), сколько необходимо для размещения всех элементов, найденных в командной строке, а не по одному на каждый.
Чарльз Даффи
@CharlesDuffy Если они запустятся, find */то проблема не возникнет -exec, каталог с дефисом может оказаться findопцией, и он будет жаловаться.
Бармар