2010-08-15 2 views
2

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

+0

Какой язык программирования вы используете? –

ответ

5

Я думаю, что вы имели в виду "предваряется"

СПУСТЯ EDIT

SH сценарий:

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

+0

Учитывая использование «рекурсивно» в вопросе, я думаю, что это должно быть «-name». * «'. Кроме того, если ваша система довольно старая и еще не поддерживает ее, '-exec rm {} +' будет вызывать 'rm' в пакете вместо одного раза в файл. – Gilles

+0

@ Gilles исправил его, спасибо –

+0

Возможно, вы захотите использовать 'find. -name "._? *" -exec rm {} \; ', так как только точка удалит все файлы, начинающиеся с". ", например' .git'. –

1

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

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

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

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

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

винда эквивалент команды (del -R .*) намного проще для пользователя, поскольку программа del делает работу расширения wildchards для каждого подкаталога.

+1

1. Аргумент '-name' должен быть просто' '. * ''. 2. Это не будет работать, если есть имя файла (включая ведущие каталоги), содержащие пробелы или '\" '', потому что' xargs' обрабатывает эти символы специально. Не используйте 'xargs', если вы точно не знаете, что эти символы не встречаются ни в одном имени файла или каталога. Вместо этого используйте '-exec', как в ответе Габи. Здесь, так как команда' rm', вероятность катастрофы особенно велика. – Gilles

+0

-type f гарантирует, что dirs, включая., .. игнорируются. Хорошая точка, хотя и имеет файлы с ' и " в их именах.xargs пытается их интерпретировать и что вызывает проблемы. Я обновляю свой ответ с вашим предупреждением. Я по-прежнему считаю, что полезно включать этот способ делать вещи. Простой поиск показывает много упоминаний об этом. – Alkaline

2

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

find /var/www/html \(-name '.DS_Store' -or -name '._*' \) -delete 
0
 
find . \(-name '.DS_Store' -or -name '._*' \) -type f -print0 | xargs -0 rm -f 

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

Смежные вопросы