Wyniki wyszukiwania rurowego zlokalizuj w rm

11

Próbowałem biec

locate *.orig | xargs rm

ale powiedział No such file or directory

Widziałem sposoby, aby to zrobić, findale funkcja locate zwraca pełną ścieżkę do obiektu, więc powinno to być możliwe

Soldier.moth
źródło

Odpowiedzi:

20

Jeśli nazwy plików zawierają spacje, których powinieneś użyć

locate -0 $something | xargs -0 rm

Ze locatestrony podręcznika :

-0, --nullRozdziel 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 *.origpomocą cudzysłowów, aby uniknąć rozszerzenia powłoki i przekazać go, aby zlokalizować nietknięty.

enzotib
źródło
Co rozumiesz przez „rozszerzenie powłoki”?
soldier.moth
+1 za drugi przykład. Zawsze używam, | while readponieważ mój katalog domowy jest pełen plików ze spacjami.
matpie
@ Soldier.moth: jeśli w bieżącym folderze znajdują się pliki odpowiadające wzorowi *.orig, powłoka rozwinie wzór do, powiedzmy file1.orig file2.orig ..., tak, locateaby nie widział dokładnie takiego ciągu, *.origjak powinien.
enzotib
Aby grep zlokalizować wyjście, możesz wtedy tr '\n' '\0'.
Pablo Bianchi,
2

To xargsniexarg

maco
źródło
To właśnie miałem na myśli wpisanie pytania z pamięci, dziękuję.
soldier.moth
No dobrze Wyglądało to na błąd, który pojawiał się po wprowadzeniu niepoprawnego polecenia
maco
0

Polecenie locate *.orig | xargs rmfaktycznie działa, ale działo się tak, że locateznajdowanie *.origplików w koszu i rmwyrzucanie błędu No such file or directorypodczas próby usunięcia plików w koszu.

Soldier.moth
źródło
Powinieneś dodać informacje jako „komentarz” do oryginalnej odpowiedzi lub możesz edytować oryginalną odpowiedź. To nie jest odpowiedź na twoje pytanie.
enzotib
Jest to odpowiedź na moje pytanie, ponieważ przyczyną błędu był to, że lokalizator znajdował pliki * .orig w koszu i rm nie mógł ich usunąć. Zaakceptowałem twoją odpowiedź i głosowałem na obie odpowiedzi, ponieważ były one dobrze napisane i mogą pomóc komuś, kto przyjdzie później.
soldier.moth
0

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.

nieznany użytkownik
źródło
0

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 
Abdennour TOUMI
źródło