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


12

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/*.jare 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 libantes 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 lsmas não encontrei nenhuma solução.

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


O que você está fazendo com os nomes desses arquivos? Você está apenas listando-os no terminal ou está passando-os para outro programa ou script (individualmente ou como uma lista)? A maneira correta de lidar com isso depende de como os nomes de arquivos são usados.
Kusalananda

A idéia era fazer algumas estatísticas sobre bibliotecas de terceiros em um projeto java com vários módulos. Eu só queria a lista e fazer uma ordenação e uniq depois #
181918

Respostas:


19

Em vez de analisar ls, você deve usar find. Em seguida, você também pode executar basenameem cada arquivo para remover os principais diretórios:

find lib/ -name '*.jar' -exec basename {} \;

Ok, desta forma, é perfeito para mim também.
рüффп

3
Veja também a -maxdepthopção

13

Com o GNU, findnão há necessidade de executar basenametodos os arquivos, isso será muito mais rápido (especialmente se houver muitos arquivos):

find lib -name '*.jar' -printf '%P\n'

11

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.


Os espaços também não serão um problema.
terdon

Essa é uma boa idéia e provavelmente será a opção mais rápida. Eu faria printf '%s\n' *.jarpara obter cada arquivo em uma linha diferente.
Graeme

Ou mesmo printf '%s\0' *.jarpara eliminar problemas de espaço em branco (embora esse não seja o Q).
Graeme

5

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

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

Os -F'/'conjuntos separador de campo para /o que significa que o último campo, $NF, será o nome do arquivo.


1

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

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

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=cpara garantir que os espaços nos nomes de arquivos não danifiquem xargs.


Eu não percebi isso. Obrigado! Encontrei esta gema em outra troca de pilhas. Você pode introduzir aspas nos resultados de ls com --quoting-style = c. Portanto, o comando completo resultante seria: `ls --quoting-style = c -1 lib / *. Jar | xargs --max-args 1 basename`
yoni

-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 os arquivos .jar. Você pode usar o seguinte comando para fazer o mesmo em sua consulta:

ls -R lib | grep jar| grep -v jar*

Isso falharia mal se houvesse um subdiretório que também contenha arquivos jar ou um arquivo nomeado, por exemplo, "list-of-jars.txt".
Jules

grep -v jar * filtraria os resultados com o arquivo nomeado como seu exemplo citado.
precisa saber é o seguinte

verdade. também filtraria todos os arquivos pretendidos. Agora, analisando novamente, não vejo circunstâncias em que o comando que você sugere realmente produza alguma saída ...
Jules

Não, ele exibia arquivos como mylib_2.jare filtrava arquivos como list-of-jars.txt.
Joshi.mohit86

Não, não faz. Eu apenas tentei. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> nenhuma saída.
Jules
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.