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.