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*