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.


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


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
...

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





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'

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.