Как удалить все файлы, которые возвращает 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чтобы не сделать что-то действительно плохое и не удалить файл, который вы не хотели удалять

Другие вопросы по тегам