Я пробовал бегать
locate *.orig | xargs rm
но сказано No such file or directory
Я видел способы сделать это, find
но locate возвращает полный путь к объекту, поэтому это должно быть возможно
Я пробовал бегать
locate *.orig | xargs rm
но сказано No such file or directory
Я видел способы сделать это, find
но locate возвращает полный путь к объекту, поэтому это должно быть возможно
Ответы:
Если имена файлов содержат пробелы, вы должны использовать
locate -0 $something | xargs -0 rm
-0
,--null
Разделите записи на выходе, используя символ ASCII NUL вместо записи каждой записи в отдельной строке. Эта опция предназначена для взаимодействия с опцией --null GNU xargs (1).
или
locate $something | while read f; do rm "$f"; done
Кроме того, вы должны защищать *.orig
кавычками, чтобы избежать расширения оболочки, и передать его, чтобы найти нетронутым.
| while read
так как мой домашний каталог полон файлов с пробелами.
*.orig
, оболочка развернет шаблон, скажем file1.orig file2.orig ...
, так, locate
чтобы не видеть точную строку, *.orig
как следует.
tr '\n' '\0'
.
Это xargs
неxarg
На locate *.orig | xargs rm
самом деле команда работает, но происходит то, что locate
происходит поиск *.orig
файлов в мусорном ведре и rm
появляется ошибка No such file or directory
при попытке удалить файлы в мусорном ведре.
locate не выполняет сглаживание, а оболочка делает. Оболочка расширяет * .orig до того, что находит в текущем каталоге, что соответствует * .orig.
Просто используйте
locate .orig
и если это даст вам то, что вам нужно
locate .orig | xargs rm
или, как упоминается энзотиб
locate -0 .orig | xargs -0 rm
если у вас есть пробелы в именах файлов.
Хитрость: сохранить все пути в файле 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