Я знаю, что его вопрос не касался этого, но я никогда не могу вспомнить: обрабатывает ли ваш пример имена файлов с пробелами?
Grundlefleck 06
4
Да, для этого нужны print0 и -0 для xargs. Обычно он не обрабатывает пробелы правильно, однако с print0 он будет печатать имя файла с нулевым символом в конце строки, который xarg с -0 затем будет использовать для передачи полного пути к xargs без шанса иметь пробел используется второй или третий параметр команды rm, что может быть очень плохо!
X-Istence 06
7
@X: более новый findutils поддерживает -deleteдействие, которое может сократить это. @JT: рекурсивный поиск в .. Зависит от того, сколько там файлов и подкаталогов ... не можете ли вы просто запретить их загрузку?
ephemient 06
1
Использование -r(рекурсивного) флага в этом случае не рекомендуется, поскольку вы не хотите удалять какие-либо каталоги ..
Дэниел Зохар
2
@IlmariKaronen: хорошая мысль. Разве не command rmбыло бы лучшего (то есть более прямого) решения? (Под "прямым" я подразумеваю, что он имеет дело именно с рассматриваемой проблемой и ничем другим, и, следовательно, с меньшей вероятностью будет иметь какие-либо нежелательные побочные эффекты, а также будет более понятным для всех, кто должен поддерживать код позже.)
Более новая версия findutils поддерживает -delete:
find . -name ".DS_Store" -delete
Добавить, -printчтобы также получить список удалений.
Я считаю, что команда будет работать на вас, если у вас есть современная система POSIX. По крайней мере, он работает для меня в OS X 10.8 и работает для других, кто тестировал его в macOS 10.12 (Mojave).
Кредит @ephemient в комментарии к сообщению @ X-Istence (подумал, что это было достаточно полезно, чтобы оправдать собственный ответ).
@OneOfOne: как говорится в моем комментарии, я получил это от @ ephemient. Как новичок в bash, я нашел ваше (возможно, более правильное) решение гораздо менее читабельным и удобным. Они могут быть функционально идентичными, но я считаю, что этот синтаксис обеспечивает большую ясность.
rattray 06
1
Символ '.' не требуется, поскольку findпо умолчанию выполняется рекурсивный переход в текущий рабочий каталог.
Том Рассел
В более новых версиях программы каталог может быть опущен, и это будет означать текущий рабочий каталог ( wikipedia ). Вам все еще нужна .macOS 10.12 (Sierra).
Это прекрасно работает. НО осторожно, я просто использовал эту rm -i находку ./ -name '* py'` -rf , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`). Слава богу за мой сценарий резервного копирования.
ryanjdillon
1
Если файлов слишком много, выдается сообщение об ошибке:-bash: /bin/rm: Argument list too long
У Zsh есть много других функций, которых не хватает bash, но только на эту стоит переключиться. Он доступен в большинстве (возможно, во всех) дистрибутивах Linux, а также в cygwin и OS X.
Вы можете найти дополнительную информацию на сайте zsh .
Возможная проблема: поскольку вы не используете xargs, вы можете столкнуться с ограничением длины аргумента командной строки. Кроме того, Bash 4 **тоже поддерживает :-) (хотя и не по умолчанию, shopt -s globstarнеобходимо установить)
Использование exec для каждого найденного файла не является быстрым. Быстрее распечатать их, а затем использовать xargs для однократного вызова rm.
X-Istence 06
3
Однако, если у вас есть findподдерживающий его, +он похож на xargs: find . -name "FILE-TO-FIND" -exec rm -rf {} +- (также вы пропустили пробел раньше -exec)
Приостановлено до дальнейшего уведомления.
3
у нас никогда не было xargs. И нам пришлось идти в школу пешком, в обе стороны в гору .......
Убедитесь, что в вашем ответе содержится список того, что удаляется, и объясняется, почему кто-то может захотеть использовать xargsи print0вместо exec(есть причины).
Джош Хабдас
3
Лучше увидеть, что удаляется, добавив к этому ответу -print
Вы не объясняете, когда кто-то может захотеть поставить перед командой префикс, sudoи не предоставляете никакой информации о том, как это rmработает в контексте вашего ответа.
Ответы:
перейдите в каталог и используйте:
find . -name ".DS_Store" -print0 | xargs -0 rm -rf find . -name "._*" -print0 | xargs -0 rm -rf
Не тестировалось, сначала попробуйте их без xargs!
Вы можете заменить точку после find на каталог вместо того, чтобы сначала переходить в каталог.
источник
-delete
действие, которое может сократить это. @JT: рекурсивный поиск в.
. Зависит от того, сколько там файлов и подкаталогов ... не можете ли вы просто запретить их загрузку?-r
(рекурсивного) флага в этом случае не рекомендуется, поскольку вы не хотите удалять какие-либо каталоги ..command rm
было бы лучшего (то есть более прямого) решения? (Под "прямым" я подразумеваю, что он имеет дело именно с рассматриваемой проблемой и ничем другим, и, следовательно, с меньшей вероятностью будет иметь какие-либо нежелательные побочные эффекты, а также будет более понятным для всех, кто должен поддерживать код позже.)find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete
источник
Более новая версия findutils поддерживает
-delete
:find . -name ".DS_Store" -delete
Добавить,
-print
чтобы также получить список удалений.Я считаю, что команда будет работать на вас, если у вас есть современная система POSIX. По крайней мере, он работает для меня в OS X 10.8 и работает для других, кто тестировал его в macOS 10.12 (Mojave).
Кредит @ephemient в комментарии к сообщению @ X-Istence (подумал, что это было достаточно полезно, чтобы оправдать собственный ответ).
источник
find
по умолчанию выполняется рекурсивный переход в текущий рабочий каталог..
macOS 10.12 (Sierra).Простая команда:
rm `find ./ -name '.DS_Store'` -rf rm `find ./ -name '._'` -rf
Удачи!
источник
rm -i
находку ./ -name '* py'` -rf, which did NOT prompt me to delete files. you will need to take it on the end (i.e.
-rfi`). Слава богу за мой сценарий резервного копирования.-bash: /bin/rm: Argument list too long
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm
источник
Вы можете переключиться на zsh вместо bash. Это позволяет использовать ** для сопоставления файлов в любом месте дерева каталогов:
Вы также можете комбинировать их так:
У Zsh есть много других функций, которых не хватает bash, но только на эту стоит переключиться. Он доступен в большинстве (возможно, во всех) дистрибутивах Linux, а также в cygwin и OS X.
Вы можете найти дополнительную информацию на сайте zsh .
источник
**
тоже поддерживает :-) (хотя и не по умолчанию,shopt -s globstar
необходимо установить)find . -name "FILE-TO-FIND"-exec rm -rf {} \;
источник
find
поддерживающий его,+
он похож на xargs:find . -name "FILE-TO-FIND" -exec rm -rf {} +
- (также вы пропустили пробел раньше-exec
)Пример рекурсивного удаления "Thumbs.db";
find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf
Подтвердить:
find . -iname "Thumbs.db"
Теперь это не должно отображать какие-либо записи с «Thumbs.db» внутри текущего пути.
источник
xargs
иprint0
вместоexec
(есть причины).Лучше увидеть, что удаляется, добавив к этому ответу -print
find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete -print
источник
если у вас Bash 4.0 ++
#!/bin/bash shopt -s globstar for file in /var/www/html/**/.DS_Store /var/www/html/**/._ do echo rm "$file" done
источник
Несколько замечаний:
'-delete' не рекурсивен. Поэтому, если .TemporaryItems (папка) содержит файлы, команда не выполняется.
Существует множество этих надоедливых файлов, созданных Mac: .DS_Store ._. DS_Store .TemporaryItems .apdisk
Эта одна команда обращается ко всем из них. Сохраняет от многократного выполнения поиска для нескольких совпадений.
find /home/foo \( -name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \;
источник
Это тоже работает:
sudo rm -rf 2018-03-*
вот ваши удаляющие файлы с именами формата 2018-03- (что-то еще)
будь проще
источник
sudo
и не предоставляете никакой информации о том, как этоrm
работает в контексте вашего ответа.