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.

Srid dit réintégrer Monica
la source
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

Steve Folly
la source
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
...
arrayown
la source
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
5
ls -1 <path> | sed 's#.*/##'
mpez0
la source
Ah! Enfin quelque chose qui fonctionne avec plusieurs arguments!
Aurélien Ooms
4

awk Solution:

ls -1 /path/glob | awk -F'/' '{print $NF}'
Amnon
la source
2

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

Glen Y.
la source
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*
dcoles
la source
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'
Ryan Bright
la source
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
Justice
la source
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