web-dev-qa-db-fra.com

Dire `ls` d'imprimer uniquement le nom de base

Ceci est le comportement par défaut de 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

Comment faire ls Imprimer uniquement le nom de base? Comme:

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

Remarque: Je préfère la coque globale sur l'utilisation de find AS/NET/NAS/DATA/LANGUES/SITESS/SITES/REX/GRATUITS contient un grand nombre de fichiers et de répertoires.

22
Sridhar Ratnakumar

Tandis que xargs -0 est destiné à être utilisé pour l'entrée délimitée par\0 (comme find -print0), ls n'a pas une telle option pour délimiter sa production de cette manière.

Pourtant,

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

ferait le tour pour convertir les nouvelles lignes en nulls en cours de route. Cela permet ensuite à Xargs de travailler avec des noms qui ont des espaces.

Edit: Ajouté -n 1 à Xargs

19
Steve Folly

J'utilise ceci:

ls | tr '\n' '\n'

Il donne une liste comme:

file1.mp3
file2.mp3
file3.mp3
...
12
arrayown

ls [chemin optionnel] | Xargs -0 BaseName

2
Glen Y.

Vous avez dit que vous préférez Globbing sur find, mais saviez-vous que les deux ne sont pas mutuellement exclusives? Globbing se produit sur n'importe quelle commande que vous exécutez, pas seulement ls. Par exemple:

$ 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

Notez que l'exemple de la recherche peut utiliser -Print0 qui est pratique si vos chemins contiennent des espaces blancheurs (les solutions tr mentionnées mentionnées ailleurs fonctionnent bien sur des espaces normaux, mais pas sur des fichiers contenant des nouvelles lignes).

Enfin, si vous avez accès à GNU Recherche, vous pouvez également utiliser -printf qui évite complètement l'appel de BasEname:

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