Jestem w skrypcie bash i chcę uzyskać listę wszystkich plików (powiedzmy wszystkie pliki jar). Wykonuję polecenie ls -1 lib/*.jar
i otrzymuję wynik:
lib/mylib_1.jar
lib/mylib_2.jar
...
Czy jest jakaś opcja, aby uzyskać następujące dane wyjściowe:
mylib_1.jar
mylib_2.jar
...
Tworzenie cd lib
wcześniej nie jest opcją, ponieważ jestem w pętli i muszę znajdować się w folderze nadrzędnym, aby wykonać czynności, które chcę wykonać w pętli.
Próbowałem znaleźć informacje, pisząc na maszynie, man ls
ale nie znalazłem żadnego rozwiązania.
Rozwiązanie z innym poleceniem byłoby dobre, pod warunkiem, że mogę potokować je do mojego ls
polecenia lub samowystarczalne.
Odpowiedzi:
Zamiast analizować ls powinieneś użyć
find
zamiast tego. Następnie możesz również wykonaćbasename
dla każdego pliku, aby usunąć wiodące katalogi:źródło
-maxdepth
opcję.Dzięki GNU
find
nie trzeba uruchamiaćbasename
każdego pliku, będzie to znacznie szybsze (szczególnie jeśli jest dużo plików):źródło
Co powiesz na to
(cd lib && echo *.jar)
, zakładając, że w nazwach plików nie ma białych znaków ani znaków specjalnych. Skrypt nadrzędny nigdy nie zmienia katalogu.źródło
printf '%s\n' *.jar
aby każdy plik znalazł się w innej linii.printf '%s\0' *.jar
celu wyeliminowania problemów z białymi znakami (chociaż nie jest to Q).Jak powiedział Josh Jolly w swojej odpowiedzi, nigdy nie powinieneś parsować
ls
, zamiast tego użyj podejścia z jego odpowiedzi. Mimo to otoawk
rozwiązanie do usuwania ścieżek z nazw plików, po prostu nie używaj go z ls:Te
-F'/'
zestawy separator pola do/
co oznacza, że ostatnie pole,$NF
będzie nazwa pliku.źródło
find
prawdopodobnie jest droga, ale jeśli naprawdę zrobić (nie) chce zdejmowaćlib/
zls -1
, można użyćsed
:źródło
Możesz to zrobić za pomocą xargs z parametrem --max-args (lub krótszym aliasem -n):
ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename
Zauważ, że używamy,
--quoting-style=c
aby upewnić się, że spacje w nazwach plików nie psują xargs.źródło
Alternatywnym sposobem rozwiązania zapytania jest wyświetlenie listy wszystkich używanych plików
ls -R
. Połącz dane wyjściowe polecenia ls z grep, aby wyświetlić tylko pliki .jar. Możesz użyć następującego polecenia, aby zrobić to samo dla zapytania:źródło
mylib_2.jar
i odfiltrowuje pliki takie jaklist-of-jars.txt
.find development -name '*.jar' | wc -l
->70
.ls -R development | grep jar| grep -v jar*
-> brak wyjścia.