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
antes não é uma opção, pois estou em um loop e preciso estar na pasta pai das ações que quero executar dentro do loop.
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á-la para o meu ls
comando ou auto-suficiente.
Respostas:
Em vez de analisar ls, você deve usar
find
. Em seguida, você também pode executarbasename
em cada arquivo para remover os principais diretórios:fonte
-maxdepth
opçãoCom o GNU,
find
não há necessidade de executarbasename
todos os arquivos, isso será muito mais rápido (especialmente se houver muitos arquivos):fonte
Que tal
(cd lib && echo *.jar)
, supondo que você não tenha espaços em branco ou caracteres especiais nos nomes dos arquivos. O script pai nunca altera o diretório.fonte
printf '%s\n' *.jar
para obter cada arquivo em uma linha diferente.printf '%s\0' *.jar
para eliminar problemas de espaço em branco (embora esse não seja o Q).Como Josh Jolly disse em sua resposta, você nunca deve analisar
ls
, use a abordagem em sua resposta. Ainda assim, aqui está umaawk
solução para remover caminhos de nomes de arquivos, apenas não use-os com ls:Os
-F'/'
conjuntos separador de campo para/
o que significa que o último campo,$NF
, será o nome do arquivo.fonte
find
é provavelmente o caminho a percorrer, mas se você realmente fazer (você não) quer retirarlib/
dels -1
, você pode usarsed
:fonte
Você pode fazer isso usando xargs com um parâmetro --max-args (ou o apelido mais curto -n):
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 nos nomes de arquivos não danifiquem xargs.fonte
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 os arquivos .jar. Você pode usar o seguinte comando para fazer o mesmo em sua consulta:fonte
mylib_2.jar
e filtrava arquivos comolist-of-jars.txt
.find development -name '*.jar' | wc -l
->70
.ls -R development | grep jar| grep -v jar*
-> nenhuma saída.