Indica 'ls' para imprimir apenas o nome do arquivo base

17

Este é o comportamento padrão 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

Como faço para que ls imprima apenas o nome de base? Como:

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

Observação : eu prefiro o shell globbing usando find como / net / nas / data / idiomas / pypm / sites / rex / free contém um grande número de arquivos e diretórios.

    
por Sridhar Ratnakumar 19.01.2010 / 20:04

8 respostas

18

Embora xargs -0 deva ser usado para entrada delimitada por \ 0 (como find -print0 ), ls não tem essa opção para delimitar sua saída dessa maneira.

No entanto,

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

faria o truque para converter newlines para nulls ao longo do caminho. Isso permite que os xargs trabalhem com nomes que tenham espaços.

EDIT: adicionado -n 1 ao xargs

    
por 19.01.2010 / 21:48
11

Eu uso isso:

ls | tr '\n' '\n'

Ele fornece uma lista como:

file1.mp3
file2.mp3
file3.mp3
...
    
por 08.10.2012 / 21:36
5
ls -1 <path> | sed 's#.*/##'
    
por 19.01.2010 / 21:56
4

awk solution:

ls -1 /path/glob | awk -F'/' '{print $NF}'
    
por 07.08.2010 / 09:55
2

ls [caminho opcional] | xargs -0 basename

    
por 19.01.2010 / 20:13
2

Ambos os nome de domínio GNU e Nome base do FreeBSD aceita um argumento -a permitindo que você passe vários caminhos para o comando. Isso funciona muito bem com a globalização de conchas.

basename -a /path/glob*
    
por 15.02.2017 / 03:52
1

Você disse que prefere ficar com mais de find , mas sabia que os dois não são mutuamente exclusivos? Globbing acontece em qualquer comando executado, não apenas ls . Por exemplo:

$ 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

Observe que o exemplo de localização pode utilizar -print0, que é útil se seus caminhos contiverem espaços em branco (as soluções tr , mencionadas em outros locais, funcionam muito bem em espaços normais, mas não em arquivos que contêm novas linhas).

Por último, se você tiver acesso ao GNU find, você também pode usar -printf, o que evita a chamada ao nome da base:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'
    
por 20.01.2010 / 01:55
-3

vá para o diretório onde você tem todos os arquivos e digite.

find *.pypm
    
por 14.08.2014 / 18:56