É possível remover o prefixo da pasta de um comando 'ls'

10

Estou em um script bash e quero obter a lista de todos os arquivos (digamos todos os arquivos jar). Eu executo o comando ls -1 lib/*.jar e recebo a saída:

lib/mylib_1.jar
lib/mylib_2.jar
...

Existe alguma opção para ter a seguinte saída:

mylib_1.jar
mylib_2.jar
...

Fazer cd lib before não é uma opção, pois estou em um loop e preciso estar na pasta pai para as ações que quero fazer dentro do loop.

Eu tentei encontrar informações digitando man ls , mas não encontrei nenhuma solução.

Uma solução com outro comando seria boa, desde que eu possa canalizá-lo para o meu comando ls ou auto-suficiente.

    
por рüффп 15.04.2014 / 15:29

7 respostas

18

Em vez de analisar ls , você deve usar find . Então você também pode executar basename em cada arquivo para remover os diretórios principais:

find lib/ -name '*.jar' -exec basename {} \;
    
por 15.04.2014 / 15:30
13

Com o GNU find não é necessário executar basename para cada arquivo, isso será muito mais rápido (especialmente se houver muitos arquivos):

find lib -name '*.jar' -printf '%P\n'
    
por 15.04.2014 / 15:49
10

Que tal (cd lib && echo *.jar) , supondo que você não tenha espaço em branco ou caracteres especiais nos nomes dos arquivos. O script pai nunca muda de diretório.

    
por 15.04.2014 / 16:36
5

Como Josh Jolly disse em sua resposta, você nunca deve analisar ls , use a abordagem em sua resposta. Ainda assim, aqui está uma solução awk para remover caminhos de nomes de arquivos, apenas não use com ls:

find . | awk -F'/' '{print $NF}'

O -F'/' define o separador de campo como / , o que significa que o último campo, $NF , será o nome do arquivo.

    
por 15.04.2014 / 15:34
1

find é provavelmente o caminho a percorrer, mas se você realmente (não) quiser retirar lib/ de ls -1 , você pode usar sed :

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar
    
por 15.04.2014 / 15:40
0

Você pode fazer isso usando xargs com um --max-args (ou o alias mais curto -n) parâmetro:

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

Observe que usamos --quoting-style=c para garantir que os espaços em nomes de arquivos não estraguem xargs.

    
por 05.05.2017 / 19:52
-1

Uma maneira alternativa de resolver sua consulta é listar todos os arquivos usando ls -R . Combine a saída do comando ls com o grep para listar apenas arquivos .jar. Você pode usar o seguinte comando para fazer o mesmo para sua consulta:

ls -R lib | grep jar| grep -v jar*
    
por 15.04.2014 / 16:04