Как удалить все файлы, которые возвращает locate

13

На данный момент это то, что я делаю:

Шаг 1:

locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar

Шаг 2:

Выполните удаление вручную, скопировав каждую строку.

rm /home/abc/fooBar
rm /home/abc/Music/fooBar

Как мне сделать это за один шаг? Что-то вроде

найдите fooBar> rm

Благодарю.

theTuxRacer
источник
Вы хотите это? rm -i найти fooBar``
LFC_fan
Я не уверен, что делает вышеупомянутое. Я просто хочу удалить все файлы из путей, которые возвращаются при запуске команды locate.
theTuxRacer

Ответы:

13

Как уже упоминалось в других разделах, xargs - ваш друг. Это действительно мощный инструмент, и я постараюсь объяснить его и обойти обычную ошибку.

Что делает xargs, так это берет строку из ввода и добавляет ее к другой команде, выполняя эту другую команду для каждой строки во вводе. Таким образом , путем ввода locate foobar | xargs rm -f, вывода команды локализации будет исправлен на конец этого 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'
Финли
источник
9
Чтобы быть устойчивым к файлам с экзотическими символами (символами новой строки, кавычками, апострофами и т. Д.) В своих именах, вы можете использовать опцию -0( --null) для поиска и xargs. Это использует безопасный символ ASCII NUL для разделения имен файлов:locate -0 foobar | xargs -0 rm
Jukka Matilainen
1
+1 за ответ, и выбран для упоминания о приобретенном ^ _ ^
theTuxRacer
Я попробовал это, но это не сработало.
Pronoy999
Работал частично
SteveS
7

Возможно, вам понадобится еще несколько вариантов для использования с xargs. Проверьте это сначала с xargs -p. Если все в порядке, уберите -pопцию:

locate foobar | xargs rm
QBi
источник
6

Чтобы удалить все файлы, которые возвращает locate, введите в своем терминале следующую команду

locate foobar | xargs rm -f

karthick87
источник