@vlarkanov

BASH: как удалять файлы, названия которых содержит пробелы?

Есть директория /mnt/hdd-backup/APPOLO/Backup Job APPOLO, содержащая файлы с именами вида
Backup Job APPOLO2018-08-22T125035.vbk


Нужно удалять файлы старше определенного срока (в примере 9 минут)

выполняю:

find "$path" -type f -mmin +9 | xargs rm


Получаю:

rm: cannot remove ‘/mnt/hdd-backup/APPOLO/Backup’: No such file or directory
rm: cannot remove ‘Job’: No such file or directory
rm: cannot remove ‘APPOLO/Backup’: No such file or directory
rm: cannot remove ‘Job’: No such file or directory
rm: cannot remove ‘APPOLO.vbm’: No such file or directory


Ага. xargs не умеет в пути с пробелами. А если через for each?


oldfiles=$(find "$path" -type f -mmin +9)
for oldfile in $oldfiles
do
rm $oldfile 2>> $flog
done



А вот что:

rm: cannot remove ‘/mnt/hdd-backup/APPOLO/Backup’: No such file or directory
rm: cannot remove ‘Job’: No such file or directory
rm: cannot remove ‘APPOLO/Backup’: No such file or directory
rm: cannot remove ‘Job’: No such file or directory
rm: cannot remove ‘APPOLO.vbm’: No such file or directory


Как победить, товарищи?
  • Вопрос задан
  • 521 просмотр
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
1. меняем для xargs и find разделитель на символ null, обе эти команды про него знают:
find "$path" -type f -mmin +9 -print0 | xargs -0 rm

2. Удаляем файлы самой командой find:
find "$path" -type f -mmin +9 -delete

3. Сохраняем список файлов в переменную и считываем построчно:
A=$(find "$path" -type f -mmin +9)
while read; do rm "$REPLY";done<<<"$A"
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
выполняю:
find "$path" -type f -mmin +9 | xargs rm
...
Ага. xargs не умеет в пути с пробелами.


Идиома для обработки имён файлов с пробелами/другой ерундой: find ... -print0 | xargs -0 ... -- т.е. использовать нулевой символ в качестве разделителя полей при выводе из find и при вводе в xargs.
Ответ написан
Комментировать
@notwrite
man find, говорит: "Используй -delete, user"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы