Я пробовал бегать
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