Назад | Перейти на главную страницу

Удалить все файлы по имени файла (однострочный Linux)

В CakePHP есть соглашение о помещении файлов, называемых «пустыми», в пустые каталоги. Я уверен, что у них есть причина, но меня это действительно беспокоит. (Да, ОКР, я знаю ...)

Мне нужна однострочная команда оболочки linux, которая удалит каждый файл с именем «пустой» во всех дочерних каталогах. (Полагаю, было бы полезно указать подстановочные знаки и для более общего использования.)

Любые идеи?

Самый простой:

найти . -name empty -type f -exec rm -f {} \;

"." начинается в текущем каталоге, замените на путь к каталогу, если вы хотите выполнить его в другом месте.

«-type f» просто гарантирует, что это файл.

Краткое содержание:

Есть несколько вариантов:

find . -name empty -type f -exec rm -f {} \;

позвоню rm один раз для каждого файла

find . -name empty -type f -exec rm -f {} +

позвоню rm только так часто, как необходимо, создавая командную строку, которая использует максимально возможную длину

find . -name empty -type f | xargs rm -f

так же, как и выше, вы можете (или, скорее, будете, как указано выше - это был мой подход) столкнуться с проблемами с именами файлов, которые содержат символы, которые требуют цитирования

find -name empty -type f -print0 | xargs -0 rm -f

наверное лучшее решение Пожалуйста, проголосуйте за комментарий Дэна Си, это его решение. Это будет, как и в предыдущем вызове фрагмента rm только так часто, как необходимо, создавая командную строку, которая использует максимально возможную длину, -0 переключатель означает, что аргументы rm команда будет разделена \0 так что экранирование выполняется прямо в оболочке.

Замечание о комментарии, который нужно ограничить с помощью -type f вы также можете ограничить -size 0 (ровно 0 байт) Я не могу проверить, действительно ли CakePHP соблюдает это соглашение, но почти каждый известный мне проект, который использует файлы-заполнители для проверки пустых каталогов в исходных репозиториях, делает это.

Также, как отмечает Мэтт Саймонс, добавление -v flag может быть хорошим вариантом, чтобы увидеть некоторый прогресс, однако обратите внимание, что это определенно замедлит весь процесс. Лучшим подходом может быть отслеживание процесса с помощью strace -p $pid_of_xargs (добавьте дополнительные параметры, если вы хотите следить за дочерними процессами, это возможно)

Еще одно примечание, которое я только что нашел на странице руководства:

find -name empty -type f -delete

в конце концов, у find есть все, что встроено :)

Возможная причина, по которой cakePHP может это сделать, заключается в том, что некоторые системы контроля версий (например, Mercurial и Git) не могут отслеживать пустые каталоги.

Это может сделать:

rm -f $(find /var/www -name empty -print)

По умолчанию находить рекурсии.