Próbowałem biec
locate *.orig | xargs rm
ale powiedział No such file or directory
Widziałem sposoby, aby to zrobić, find
ale funkcja locate zwraca pełną ścieżkę do obiektu, więc powinno to być możliwe
Próbowałem biec
locate *.orig | xargs rm
ale powiedział No such file or directory
Widziałem sposoby, aby to zrobić, find
ale funkcja locate zwraca pełną ścieżkę do obiektu, więc powinno to być możliwe
Odpowiedzi:
Jeśli nazwy plików zawierają spacje, których powinieneś użyć
locate -0 $something | xargs -0 rm
-0
,--null
Rozdziel wpisy na wyjściu za pomocą znaku NUL ASCII zamiast wpisywać każdy wpis w osobnym wierszu. Ta opcja została zaprojektowana pod kątem współdziałania z opcją --null GNU xargs (1).
lub
locate $something | while read f; do rm "$f"; done
Powinieneś również chronić się za *.orig
pomocą cudzysłowów, aby uniknąć rozszerzenia powłoki i przekazać go, aby zlokalizować nietknięty.
| while read
ponieważ mój katalog domowy jest pełen plików ze spacjami.
*.orig
, powłoka rozwinie wzór do, powiedzmy file1.orig file2.orig ...
, tak, locate
aby nie widział dokładnie takiego ciągu, *.orig
jak powinien.
tr '\n' '\0'
.
To xargs
niexarg
Polecenie locate *.orig | xargs rm
faktycznie działa, ale działo się tak, że locate
znajdowanie *.orig
plików w koszu i rm
wyrzucanie błędu No such file or directory
podczas próby usunięcia plików w koszu.
locate nie wykonuje globowania, ale robi to powłoka. Powłoka rozwija * .orig do tego, co znajdzie w bieżącym katalogu, który pasuje do * .orig.
Po prostu użyj
locate .orig
a jeśli to zapewni ci to, czego potrzebujesz
locate .orig | xargs rm
lub, jak wspomniano enzotib
locate -0 .orig | xargs -0 rm
jeśli masz nazwy białych znaków w nazwach plików.
Sztuczka: Zapisz wszystkie ścieżki w pliku tmp. następnie zapętlić:
#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
pth=$line
rm "$pth"
done < /tmp/tmp.txt
rm -rf /tmp/tmp.txt