Powiedz `ls`, aby wydrukował tylko podstawową nazwę pliku

21

To jest domyślne zachowanie ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

Jak mogę lswydrukować tylko basename? Lubić:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

Uwaga : Wolę globowanie powłoki zamiast używania findjako / net / nas / data / languages ​​/ pypm / sites / rex / free zawiera ogromną liczbę plików i katalogów.

Srid mówi Przywróć Monikę
źródło
1
wolisz globbing powłoki OVER używając find, gdy katalog zawiera wiele plików? literówka?
akira,
1
Zgaduję, że OP nie chce listy podkatalogów i nie jest świadomy opcji przekazywania -maxdepth 1do find.
intuicyjnie

Odpowiedzi:

19

Chociaż xargs -0ma być używany do wprowadzania danych ograniczonych przez \ 0 (jak find -print0), lsnie ma takiej opcji, aby ograniczyć wyniki w ten sposób.

Jednak,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

zrobiłby sztuczkę, aby po drodze zamienić znaki nowej linii na wartości zerowe. Dzięki temu xargs może pracować z nazwami ze spacjami.

EDYCJA: dodano -n 1do xargs

Steve Folly
źródło
To nie działa dla mnie: basename: extra operand \ 033 [0m / net / nas / data / languages ​​/ pypm / sites / rex / free / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m ''
Srid mówi Przywróć Monikę
@Sridhar: może potrzebujesz -n 1zasugerowanej gdzie indziej opcji xargs? (odpowiedź zredagowana)
Steve Folly,
Chociaż osobiście wolę własną odpowiedź (ponieważ prawie nigdy nie mam do czynienia ze spacjami w nazwach plików), zaznaczę to jako odpowiedź, która obsługuje również spacje.
Srid mówi Przywróć Monikę
Jeśli wersja Mac Xargs obsługuje -dopcję (separator), możesz to zrobić ls ... | xargs -d '\n' -n 1 basename.
intuicyjnie
12

Używam tego:

ls | tr '\n' '\n'

Daje listę taką jak:

file1.mp3
file2.mp3
file3.mp3
...
arrayown
źródło
3
Jest to w zasadzie to samo co ls -1(i wyłączone kolorowanie), co lssugeruje, że gdy nie zapisują do terminala. Wygląda na to, że trochę brakuje ci sensu, ponieważ problemem jest usunięcie nazwy katalogu przy określaniu lsargumentów ścieżki za pomocą symboli wieloznacznych. Spróbuj ls -d "$PWD/"* | tr '\n' '\n'zobaczyć, jaki jest rzeczywisty problem.
Daniel Beck
-1 - nie jestem pewien, dlaczego ludzie wciąż oceniają tę odpowiedź. ls -1Jak zauważył Daniel Beck, nie tylko robi to samo , ale także nie działa, gdy używane są globusy.
slhck
-1 - To jest to samo co ls -1i działa tylko w bieżącym katalogu, a nie ze ścieżką podobną do ls path/*.
Brendan Byrd
5
ls -1 <path> | sed 's#.*/##'
mpez0
źródło
AH! Wreszcie coś, co działa z wieloma argumentami!
Aurélien Ooms
4

awk rozwiązanie:

ls -1 /path/glob | awk -F'/' '{print $NF}'
Amnon
źródło
2

ls [ścieżka opcjonalna] | xargs -0 basename

Glen Y.
źródło
2
-1: ls nie może rozgraniczać nazw przez \ 0, czego xargs -0szuka.
Steve Folly,
2

Zarówno basename GNU, jak i basename FreeBSD akceptują -aargument pozwalający na przekazanie wielu ścieżek do polecenia. Działa to doskonale z globowaniem powłoki.

basename -a /path/glob*
dcoles
źródło
1

Powiedziałeś, że wolisz globowanie niż find, ale czy wiesz, że te dwa nie wykluczają się wzajemnie? Globowanie ma miejsce przy każdym uruchomieniu polecenia, nie tylko ls. Na przykład:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

Zauważ, że w przykładzie find można użyć opcji -print0, która jest przydatna, jeśli ścieżki zawierają spacje ( trwspomniane gdzie indziej rozwiązania oparte na bazach świetnie sprawdzają się na zwykłych przestrzeniach, ale nie na plikach zawierających rzeczywiste znaki nowej linii).

Na koniec, jeśli masz dostęp do GNU find, możesz także użyć -printf, co całkowicie eliminuje wywołanie basename:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'
Ryan Bright
źródło
Niestety -printfopcja nie jest dostępna w wersji MacOSX find.
Srid mówi Przywróć Monikę
Dobra decyzja; przepraszam za niedopatrzenie. Zaktualizowałem odpowiedź.
Ryan Bright,
-3

przejdź do katalogu, w którym masz wszystkie swoje pliki i wpisz.

find *.pypm
sprawiedliwość
źródło
1
OP wyraźnie oświadczył, że nie chce korzystać find.
gronostaj
1
Nie robi to nawet tego, czego potrzebuje PO. (Uwaga: powinieneś użyć, find . -name '*pypm'jeśli w ogóle ... po prostu umieszczenie globu obok znalezienia niczego nie osiąga - wtedy możesz po prostu napisać ls *.pypm.)
slhck