Как рекурсивно удалить все файлы в папке, начинающиеся с ._?

Как говорится в заголовке, я пытаюсь рекурсивно удалить все файлы в папке, начинающиеся с ._. Для каждого файла на моем сайте существует файл с точно таким же именем, но с добавленным к нему ._. Как мне избавиться от них?


person Ray Brown    schedule 15.08.2010    source источник
comment
Какой язык программирования вы используете?   -  person Mark Byers    schedule 15.08.2010


Ответы (4)


Я думаю, вы имели в виду "предварительно"

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ

Сценарий SH:

find . -name ".?*" -exec rm {} \;
Предыдущий код не работал рекурсивно; этот делает. Если вы хотите также удалить папки, используйте это:
find . -name ".?*" -exec rm -R {} \;

person Gabi Purcaru    schedule 15.08.2010
comment
Учитывая использование «рекурсивно» в вопросе, я думаю, что это должно быть -name ".*". Кроме того, если ваша система не устарела и еще не поддерживает ее, -exec rm {} + будет вызывать rm в пакетном режиме, а не один раз для каждого файла. - person Gilles 'SO- stop being evil'; 16.08.2010
comment
Вместо этого вы можете использовать find . -name "._?*" -exec rm {} \;, так как точка удалит все файлы, начинающиеся с ., например .git. - person Michael Sauter; 03.07.2013

Возможный дубликат этого сообщения, и я успешно использовал его на своем собственном рабочем сервере:

find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete
person mrclarkles    schedule 07.02.2013

Редактировать: Пользователь Gilles ниже правильно упоминает, что следующий альтернативный метод может быть опасным, поскольку xargs не воспринимает одинарные и двойные кавычки в имени файла буквально. Файл с именем Today's special.txt вызовет ошибку (незавершенные кавычки). Я по-прежнему включаю его сюда для полноты картины, так как он широко упоминается в Интернете.

Другой аналогичный способ сделать это в Unix/Mac — передать в rm.

find . -name '.*' -type f | xargs rm -f

Аргумент -type f говорит ему игнорировать каталоги и специальные файлы, такие как ., .., символические ссылки и файлы dev.

К сожалению, мы не можем использовать что-то вроде rm -R .*, потому что шаблон ввода .* расширяется оболочкой до того, как будет передан команде rm. Это приведет к рекурсивному удалению всех файлов, соответствующих файлам из начального каталога.

Эквивалентная команда Windows (del -R .*) намного проще для пользователя, потому что программа del выполняет работу по раскрытию подстановочных знаков для каждого подкаталога.

person Bernard    schedule 15.08.2010
comment
1. Аргумент -name должен быть просто '.*'. 2. Это не будет работать, если имя файла (включая начальные каталоги) содержит пробелы или \"', потому что xargs обрабатывает эти символы особым образом. Не используйте xargs, если вы точно не знаете, что эти символы не встречаются ни в одном имени файла или каталога. Вместо этого используйте -exec, как в ответе Габи. Здесь, поскольку команда rm, вероятность катастрофы особенно велика. - person Gilles 'SO- stop being evil'; 16.08.2010
comment
-type f гарантирует, что каталоги, включающие ., .., игнорируются. Тем не менее, хорошо иметь файлы с ‹code›‹/code› и ‹code›‹/code› в своих именах. xargs пытается их интерпретировать, и это вызывает проблемы. Я обновлю свой ответ с вашей оговоркой. Я все еще думаю, что полезно включить этот способ ведения дел. Простой поиск показывает много упоминаний о нем. - person Bernard; 16.08.2010

find . \( -name '.DS_Store' -or -name '._*' \) -type f -print0 | xargs -0 rm -f

Используйте эту команду, чтобы включить в поиск файлы и папки с пробелами в именах.

person Shahram    schedule 04.11.2014