Dì a `ls` di stampare solo il nome file di base


21

Questo è il comportamento predefinito di 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

Come faccio a lsstampare solo il nome base? Piace:

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

Nota : preferisco il guscio di una shell che usa findcome / net / nas / data / languages ​​/ pypm / sites / rex / free contiene un numero enorme di file e directory.


1
preferisci gorgogliare la shell OVER usando find quando la directory contiene molti file? typo ??
Akira,

1
Immagino che l'OP non desideri un elenco di sottodirectory e non è a conoscenza dell'opzione per passare -maxdepth 1a find.
intuito il

Risposte:


19

Sebbene xargs -0sia destinato all'uso per input delimitato da \ 0 (like find -print0), lsnon ha tale opzione per delimitare il suo output in questo modo.

Tuttavia,

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

farebbe il trucco per convertire le nuove righe in null lungo la strada. Ciò consente quindi agli xarg di lavorare con nomi che hanno spazi.

EDIT: aggiunto -n 1a xargs


Questo non funziona per me: basename: extra operand \ 033 [0m / net / nas / data / lingue / pypm / siti / rex / free / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0 ''
Srid dice Reinstate Monica il

@Sridhar: potresti aver bisogno del -n 1suggerito altrove come opzione per xargs? (risposta modificata)
Steve Folly,

Anche se personalmente preferisco la mia risposta (dato che non ho quasi mai a che fare con gli spazi nei nomi dei file), segnerò questa come la risposta per gestire anche gli spazi.
Srid dice di reintegrare Monica il

Se la versione mac di xargs supporta l' -dopzione (delimitatore), puoi farlo ls ... | xargs -d '\n' -n 1 basename.
intuito il

12

Io uso questo:

ls | tr '\n' '\n'

Dà un elenco come:

file1.mp3
file2.mp3
file3.mp3
...

3
Questo è essenzialmente lo stesso di ls -1(e la colorazione disabilitata), poiché lsimplica quelli quando non si scrive su un terminale. Sembra che ti stia perdendo un po 'il punto, poiché il problema è rimuovere il nome dir quando specifica gli lsargomenti del percorso usando i caratteri jolly. Prova ls -d "$PWD/"* | tr '\n' '\n'a vedere qual è il problema reale.
Daniel Beck

-1 - non so perché le persone continuano a votare questa risposta. Non solo fa la stessa cosa ls -1, ma non funziona anche quando sono stati usati i globs, come ha sottolineato Daniel Beck.
slhck

-1 - È lo stesso di ls -1e funziona solo nella directory corrente, non con un percorso simile ls path/*.
Brendan Byrd,


4

awk soluzione:

ls -1 /path/glob | awk -F'/' '{print $NF}'

2

ls [percorso opzionale] | xargs -0 basename


2
-1: ls non può delimitare i nomi di \ 0 che è ciò che xargs -0sta cercando.
Steve Folly,

2

Sia nome base GNU e FreeBSD basename accettano un -aargomento che consente di passare più percorsi al comando. Funziona alla grande con il globbing delle coperture.

basename -a /path/glob*

1

Hai detto che preferisci perdere tempo find, ma sapevi che i due non si escludono a vicenda? Il globbing si verifica su qualsiasi comando eseguito, non solo ls. Per esempio:

$ 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

Si noti che l'esempio di ricerca può utilizzare -print0, utile se i percorsi contengono spazi bianchi (le trsoluzioni basate su basi menzionate altrove funzionano in modo ottimale su spazi normali, ma non su file contenenti righe effettive).

Infine, se hai accesso a GNU find, puoi anche usare -printf che evita del tutto la chiamata basename:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'

Sfortunatamente, l' -printfopzione non è disponibile nella versione MacOSX di find.
Srid dice di reintegrare Monica il

Ottima scelta; scuse per la supervisione. Ho aggiornato la risposta.
Ryan Bright,

-3

vai alla directory in cui hai tutti i tuoi file e digita.

find *.pypm

1
OP ha esplicitamente dichiarato di non voler utilizzare find.
gronostaj,

1
Inoltre, questo non fa nemmeno ciò di cui ha bisogno l'OP. (Nota: dovresti usarlo find . -name '*pypm'se non altro ... solo mettere il glob vicino per trovare non raggiunge nulla - quindi potresti semplicemente scrivere ls *.pypm.)
slhck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.