Próbuję usunąć wszystkie pliki ze spacjami w nazwach. Korzystam z następującego polecenia. Ale to daje mi błąd
Komenda : ls | egrep '. ' | xargs rm
Tutaj, jeśli używam tylko ls | egrep '. '
polecenia, daje mi całą nazwę pliku ze spacjami w nazwach plików. Ale gdy próbuję przekazać dane wyjściowe do rm, wszystkie spacje (początkowe lub końcowe) zostają usunięte. Więc moje polecenie nie wykonuje się poprawnie.
Wszelkie wskazówki na temat usuwania pliku mającego co najmniej jedno miejsce w nazwie?
echo
, aby uniknąć literówek. Dodajecho
z przodu, a wydrukuje wszystkie pliki, które zamierza usunąć.find
jest potężny, czasami nie musisz zabijać kurczaka za pomocą karabinu maszynowego. Administratorzy systemu UNIX zazwyczaj nie używająfind
(na przykład) „usuwania wszystkich plików zaczynających się na literę A” ... po prosturm A*
. Podobnie, aby usunąć pliki zawierające spacje, rm może wykonać to zadanie. Innymi słowy, nie daj się zwieść, ponieważ przestrzeń jest niewidoczna i jest specjalnie traktowana przez powłokę. Po prostu ucieknij, jak zrobił to Stephen Kitt, i możesz myśleć o tym jak o każdej innej postaci.Unikałbym analizowania
ls
wynikówDlaczego nie :
Nie ma problemu z
rm
:-).Chociaż jest to rekurencyjne i spowoduje usunięcie wszystkich plików ze spacją w bieżącym katalogu i zagnieżdżonych katalogach, jak wspomniano w komentarzach.
źródło
-name '* *'
zamiast wyrażenia regularnego; oraz (2) możesz użyć,-print0 | xargs -0 rm -i
aby rozwiązać problem @ StephenKitt.xargs
. Wystarczy użyć-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
.Spójrz na to Załóżmy nazwę „dziwny plik”
Rozwiązanie pierwsze
rozwiązanie drugie
rozwiązanie trzecie
wtedy zobaczysz i-węzeł
W przypadku bardzo dziwnych nazw plików takich jak
posługiwać się
źródło
Od
man xargs
Możemy (głównie) naprawić początkowe polecenie, zmieniając separator xargs na nowy wiersz:
ls | egrep '. ' | xargs -d '\n' rm
(nie rób tego ... czytaj dalej)Ale co jeśli nazwa pliku zawiera nowy wiersz?
touch "filename with blanks and newline"
ls
jest tak naprawdę narzędziem do bezpośredniego spożycia przez człowieka , zamiast tego musimy użyćfind
polecenia, które może oddzielić nazwy plików znakiem null (-print0
). Musimy także powiedzieć grepowi, aby używał znaków null do oddzielenia input (-z
) i output (-Z
). Na koniec mówimy xargsowi, aby używał również znaków null (-0
)find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
źródło
Możesz użyć:
źródło
Aby to zrobić, będziesz potrzebował
-Z
opcji grep i-0
opcji xargs. Ale nie zrobiłbym tego w ten sposób (ls
nie jest to odpowiednie narzędzie do pracy, istnieje wiele problemów z odczytaniem przez komputer danych wyjściowych).Zobacz inne odpowiedzi na lepszy sposób.
Również
ls | …
jest równoważne zls -d *
iecho * | …
Wszystkie mają problemy. Dlatego nie używaj w
ls
ten sposób, użyj rozwiązania z innej odpowiedzi.źródło
ls *
gdy potoki wypisują nazwy plików rozdzielane nową linią.echo
(przynajmniej niektóreecho
implementacje) rozwija sekwencje odwrotnego ukośnika.grep -Z
służy do pisania nazw plików rozdzielanych przez NUL podczas używania-l
, nie pomoże to tutaj. Jeśli miałeś na myśli-z
, to też nie pomoże, ponieważ większośćls
implementacji nie ma opcji wyświetlania nazw plików rozdzielanych przez NUL. Można jednak zrobić coś takiegoprintf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
.