Труба результаты поиска в RM

11

Я пробовал бегать

locate *.orig | xargs rm

но сказано No such file or directory

Я видел способы сделать это, findно locate возвращает полный путь к объекту, поэтому это должно быть возможно

soldier.moth
источник

Ответы:

20

Если имена файлов содержат пробелы, вы должны использовать

locate -0 $something | xargs -0 rm

С locateman-страницы :

-0, --nullРазделите записи на выходе, используя символ ASCII NUL вместо записи каждой записи в отдельной строке. Эта опция предназначена для взаимодействия с опцией --null GNU xargs (1).

или

locate $something | while read f; do rm "$f"; done

Кроме того, вы должны защищать *.origкавычками, чтобы избежать расширения оболочки, и передать его, чтобы найти нетронутым.

enzotib
источник
Что вы подразумеваете под «расширением оболочки»?
soldier.moth
+1 за ваш второй пример. Я всегда использую, | while readтак как мой домашний каталог полон файлов с пробелами.
Matpie
@ Soldier.moth: если в текущей папке есть файлы, соответствующие шаблону *.orig, оболочка развернет шаблон, скажем file1.orig file2.orig ..., так, locateчтобы не видеть точную строку, *.origкак следует.
энзотиб
Кроме того, чтобы grep найти выход вы можете затем tr '\n' '\0'.
Пабло Бьянки
2

Это xargsнеxarg

MACO
источник
Это то, что я имел в виду, печатая вопрос из памяти, спасибо.
soldier.moth
О хорошо Это выглядело как ошибка, которую вы получите, введя неправильную команду после |
Мако
0

На locate *.orig | xargs rmсамом деле команда работает, но происходит то, что locateпроисходит поиск *.origфайлов в мусорном ведре и rmпоявляется ошибка No such file or directoryпри попытке удалить файлы в мусорном ведре.

soldier.moth
источник
Вы должны добавить информацию в качестве «комментария» к исходному ответу, или вы можете редактировать исходный ответ. Это не ответ на ваш собственный вопрос.
энзотиб
Это ответ на мой вопрос, причина, по которой я получаю сообщение об ошибке, заключалось в том, что команда locate находила файлы * .orig в мусорной корзине и rm не мог их удалить. Я принял ваш ответ и проголосовал за оба других ответа, потому что они хорошо написаны и могут помочь кому-то, кто придет позже.
soldier.moth
0

locate не выполняет сглаживание, а оболочка делает. Оболочка расширяет * .orig до того, что находит в текущем каталоге, что соответствует * .orig.

Просто используйте

locate .orig

и если это даст вам то, что вам нужно

locate .orig | xargs rm

или, как упоминается энзотиб

locate -0 .orig | xargs -0 rm

если у вас есть пробелы в именах файлов.

неизвестный пользователь
источник
0

Хитрость: сохранить все пути в файле tmp. затем, цикл на это:

#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
    pth=$line
    rm "$pth" 
done < /tmp/tmp.txt

rm -rf /tmp/tmp.txt 
Абденнур ТУМИ
источник