Как говорится в заголовке, я пытаюсь рекурсивно удалить все файлы в папке, начинающиеся с ._
. Для каждого файла на моем сайте существует файл с точно таким же именем, но с добавленным к нему ._
. Как мне избавиться от них?
Как рекурсивно удалить все файлы в папке, начинающиеся с ._?
Ответы (4)
Я думаю, вы имели в виду "предварительно"
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ
Сценарий SH:
Предыдущий код не работал рекурсивно; этот делает. Если вы хотите также удалить папки, используйте это:
find . -name ".?*" -exec rm {} \;
find . -name ".?*" -exec rm -R {} \;
-name ".*"
. Кроме того, если ваша система не устарела и еще не поддерживает ее, -exec rm {} +
будет вызывать rm
в пакетном режиме, а не один раз для каждого файла.
- person Gilles 'SO- stop being evil'; 16.08.2010
find . -name "._?*" -exec rm {} \;
, так как точка удалит все файлы, начинающиеся с ., например .git
.
- person Michael Sauter; 03.07.2013
Возможный дубликат этого сообщения, и я успешно использовал его на своем собственном рабочем сервере:
find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete
Редактировать: Пользователь 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
выполняет работу по раскрытию подстановочных знаков для каждого подкаталога.
-name
должен быть просто '.*'
. 2. Это не будет работать, если имя файла (включая начальные каталоги) содержит пробелы или \"'
, потому что xargs
обрабатывает эти символы особым образом. Не используйте xargs
, если вы точно не знаете, что эти символы не встречаются ни в одном имени файла или каталога. Вместо этого используйте -exec
, как в ответе Габи. Здесь, поскольку команда rm
, вероятность катастрофы особенно велика.
- person Gilles 'SO- stop being evil'; 16.08.2010
find . \( -name '.DS_Store' -or -name '._*' \) -type f -print0 | xargs -0 rm -f
Используйте эту команду, чтобы включить в поиск файлы и папки с пробелами в именах.