Como combinar nomes de arquivos a partir da saída de saída em uma cadeia

1

Usando find , é trivial pesquisar todos os arquivos com um padrão específico:

find . -name \*.jar

Como eu combino os resultados desse comando (por exemplo, todos os nomes de arquivos) em uma única string separada por um : ?

O resultado esperado seria algo como:

"./foo.jar:./bar.jar"

Agradecemos antecipadamente por sua consideração e resposta.

    
por Ramon J Romero y Vigil 12.09.2018 / 16:35

3 respostas

2

find . -name \*.jar -printf '%P:'

    
por 12.09.2018 / 16:38
1
find . -name \*.jar | tr '\n' ':'
    
por 12.09.2018 / 16:38
0
find . -name '*.jar' | paste -sd : -

Mas isso não funcionaria corretamente se houvesse nomes de arquivos ou diretórios que contivessem caracteres de nova linha.

Para contornar isso, em um sistema GNU, você pode usar:

find . -name '*.jar' -print0 | paste -zsd: | tr '
LC_ALL=C find . -name '*:*' -prune -o -name '*.jar' -print0 |
  paste -zsd: | tr '
set -o extendedglob # best in ~/.zshrc
jar_files=(**/*.jar~*:*(ND))
printf '%s\n' ${(j/:/)jar_files}
' '\n'
' '\n'

É claro que, se os nomes dos arquivos ou diretórios tiverem : caracteres, não há muito o que fazer, embora você possa dizer find para ignorá-los:

find . -name '*.jar' | paste -sd : -

com zsh :

find . -name '*.jar' -print0 | paste -zsd: | tr '
LC_ALL=C find . -name '*:*' -prune -o -name '*.jar' -print0 |
  paste -zsd: | tr '
set -o extendedglob # best in ~/.zshrc
jar_files=(**/*.jar~*:*(ND))
printf '%s\n' ${(j/:/)jar_files}
' '\n'
' '\n'
    
por 12.09.2018 / 16:38