Dites à `ls` d'imprimer uniquement le nom de fichier de base


21

Il s'agit du 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 lsimprimer 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 globalisation du shell plutôt que l'utilisation findde / net / nas / data / languages ​​/ pypm / sites / rex / free contient un grand nombre de fichiers et de répertoires.


1
vous préférez le shell globbing OVER à l'aide de find lorsque le répertoire contient beaucoup de fichiers? faute de frappe??
akira

1
J'imagine que l'OP ne veut pas d'une liste de sous-répertoires et qu'il n'est pas au courant de l'option de passer -maxdepth 1à find.
intuition

Réponses:


19

Bien que xargs -0soit destiné à être utilisé pour une entrée délimitée par \ 0 (comme find -print0), il lsn'a pas une telle option pour délimiter sa sortie de cette manière.

cependant,

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

ferait l'affaire pour convertir les sauts de ligne en valeurs nulles en cours de route. Cela permet alors aux xargs de travailler avec des noms qui ont des espaces.

EDIT: ajouté -n 1à xargs


Cela ne fonctionne pas pour moi: 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 dit Réintégrer Monica le

@Sridhar: vous pourriez avoir besoin de ce que -n 1vous avez suggéré ailleurs comme option xargs? (réponse modifiée)
Steve Folly

Bien que je préfère personnellement ma propre réponse (car je n'ai presque jamais à traiter les espaces dans les noms de fichiers), je vais marquer cela comme la réponse car elle gère également les espaces.
Srid dit Réintégrer Monica le

Si la version mac de xargs prend en charge l' -doption (délimiteur), vous pouvez le faire ls ... | xargs -d '\n' -n 1 basename.
intuition

12

J'utilise ceci:

ls | tr '\n' '\n'

Il donne une liste comme:

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

3
C'est essentiellement la même chose ls -1(et la coloration est désactivée), comme l' lsindique ceux qui n'écrivent pas sur un terminal. Il semble que vous manquiez un peu le point, car le problème supprime le nom du répertoire lorsque vous spécifiez des lsarguments de chemin à l'aide de caractères génériques . Essayez ls -d "$PWD/"* | tr '\n' '\n'de voir quel est le problème réel.
Daniel Beck

-1 - Je ne sais pas pourquoi les gens continuent de voter pour cette réponse. Non seulement il fait la même chose ls -1, mais il ne fonctionne pas non plus lorsque des globes ont été utilisés, comme l'a souligné Daniel Beck.
slhck

-1 - C'est la même chose que ls -1, et ne fonctionne que dans le répertoire courant, pas avec un chemin comme ls path/*.
Brendan Byrd du


4

awk Solution:

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

2

ls [chemin facultatif] | xargs -0 nom de base


2
-1: ls ne peut pas délimiter les noms par \ 0, ce qui xargs -0est recherché.
Steve Folly

2

Le nom de base GNU et le nom de base FreeBSD acceptent un -aargument vous permettant de passer plusieurs chemins à la commande. Cela fonctionne très bien avec globbing shell.

basename -a /path/glob*

1

Vous avez dit que vous préfériez la globulation find, mais saviez-vous que les deux ne s'excluent pas mutuellement? La globalisation 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 recherche peut utiliser -print0 qui est pratique si vos chemins contiennent des espaces blancs (les trsolutions basées sur ailleurs mentionnées fonctionnent très bien sur les espaces normaux, mais pas sur les fichiers contenant des sauts de ligne réels).

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

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

Malheureusement, l' -printfoption n'est pas disponible dans la version MacOSX de find.
Srid dit Réintégrer Monica le

Bon appel; excuses pour la surveillance. J'ai mis à jour la réponse.
Ryan Bright

-3

allez dans le répertoire où vous avez tous vos fichiers et tapez.

find *.pypm

1
OP a explicitement déclaré qu'il ne voulait pas utiliser find.
gronostaj

1
De plus, cela ne fait même pas ce dont le PO a besoin. (Remarque: vous devriez utiliser le find . -name '*pypm'cas échéant ... simplement mettre le glob à côté pour trouver ne donne rien - alors vous pourriez simplement écrire ls *.pypm.)
slhck
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.