É 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.

рüффп
fonte
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 {} \;
Josh Jolly
fonte
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'
Graeme
fonte
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.

doneal24
fonte
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.

terdon
fonte
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

fonte
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.

yoni
fonte
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*
joshi.mohit86
fonte
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