Как удалить все файлы, которые возвращает locate
На данный момент это то, что я делаю:
Шаг 1:
locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar
Шаг 2:
Выполните удаление вручную, скопировав каждую строку.
rm /home/abc/fooBar
rm /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
чтобы не сделать что-то действительно плохое и не удалить файл, который вы не хотели удалять