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 {} \;
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.
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 {} \;
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'
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.
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.
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
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.
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*