Как удалить все файлы, которые возвращает locate
На данный момент это то, что я делаю:
Шаг 1:
locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar
Шаг 2:
Выполните удаление вручную, скопировав каждую строку.
rm /home/abc/fooBarrm /home/abc/Music/fooBar
Как мне сделать это за один шаг? Что-то вроде
найдите fooBar > rm
Благодарю.
4 ответа
Как уже упоминалось в других разделах, xargs - ваш друг. Это действительно мощный инструмент, и я постараюсь объяснить его и обойти обычную ошибку.
Что делает xargs, так это берет строку из ввода и добавляет ее к другой команде, выполняя эту другую команду для каждой строки во вводе. Итак, набрав locate foobar | xargs rm -f, вывод команды locate будет исправлен в конце rm -f команда, и выполняется для каждой строки, производимой locate foobar,
Гоча:
Но что если в ваших строках есть пробелы, возвращаемые функцией locate? Это сломает rm -f команда, потому что аргументы, передаваемые в rm, должны быть файлами (если вы не используете ключ -r), а путь к файлу должен быть экранирован или заключен в кавычки, если он содержит пробелы.
xargs предоставляет ключ -i, чтобы заменить ввод в следующей команде, а не просто добавлять ее. Так что я бы изменил предложение на
locate foobar | xargs -ixxx rm -f 'xxx'
который теперь будет ломаться, только если имена файлов, возвращаемые функцией locate, содержали апострофы.
Я должен согласиться с qbi, что вы должны быть осторожны с использованием rm -f! Используйте флаг -p для xargs, или просто запустите foobar locate перед передачей его в xargs, или удалите -f из rm.
locate foobar | xargs -p -ixxx rm -f 'xxx'
Возможно, вам понадобится еще несколько вариантов для использования с xargs, Проверьте это сначала с xargs -p, Если все в порядке, удалите -p опция:
locate foobar | xargs rm
Чтобы удалить все файлы, которые возвращает locate, введите в своем терминале следующую команду
locate foobar | xargs rm -f
Менее лаконичная альтернатива — использовать цикл с подстановкой команд :
for file in $(locate foobar); do rm "$file"; done
The $(locate foobar)бит использует выводlocate foobar, тогдаforцикл позволяет вам запускать что-то в каждой строке. Цитаты вокруг$fileдолжно позволить этому работать с пробелами в именах файлов.
ХотяxargsЕсли более кратко, то цикл может лучше подойти, если вы хотите расширить логику, например, запустив несколько команд внутри цикла.
Как предлагали другие, либо запуститеlocate foofarсначала или добавьте-iвозможностьrmчтобы не сделать что-то действительно плохое и не удалить файл, который вы не хотели удалять