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


11

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

locate *.orig | xargs rm

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

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

Ответы:


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кавычками, чтобы избежать расширения оболочки, и передать его, чтобы найти нетронутым.


Что вы подразумеваете под «расширением оболочки»?
soldier.moth

+1 за ваш второй пример. Я всегда использую, | while readтак как мой домашний каталог полон файлов с пробелами.
Matpie

@ Soldier.moth: если в текущей папке есть файлы, соответствующие шаблону *.orig, оболочка развернет шаблон, скажем file1.orig file2.orig ..., так, locateчтобы не видеть точную строку, *.origкак следует.
энзотиб

Кроме того, чтобы grep найти выход вы можете затем tr '\n' '\0'.
Пабло Бьянки

2

Это xargsнеxarg


Это то, что я имел в виду, печатая вопрос из памяти, спасибо.
soldier.moth

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

0

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


Вы должны добавить информацию в качестве «комментария» к исходному ответу, или вы можете редактировать исходный ответ. Это не ответ на ваш собственный вопрос.
энзотиб

Это ответ на мой вопрос, причина, по которой я получаю сообщение об ошибке, заключалось в том, что команда 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 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.