Transformando uma lista de arquivos separados por novas linhas em uma variável

0

Objetivo: Estou tentando encontrar todas as instâncias de *.clj ou *.cljs arquivos recursivamente dentro de um diretório, armazená-los em uma variável de string (separados por novas linhas) e transformá-los .

Portanto, se os seguintes arquivos clj(s) forem encontrados em meu diretório dir1 :

/dir1/dir2/hello1.clj
/dir1/dir2/hello2.clj
/dir1/dir2/hello3.cljs
/dir1/dir2/hello4.clj
/dir1/dir2/hello5.cljs

E minha transformação é, digamos, meramente retornar o nome de base de cada uma dessas sequências:

/dir1/dir2/hello1.clj -> hello1.clj
/dir1/dir2/hello2.clj -> hello2.clj
/dir1/dir2/hello3.clj -> hello3.clj
/dir1/dir2/hello4.clj -> hello4.clj
/dir1/dir2/hello5.clj -> hello5.clj

Então, como posso escrever uma função f tal que

$ VAR=$(f dir1)

satisfaz

$ echo "$VAR"
  hello1.clj
  hello2.clj
  hello3.clj
  hello4.clj
  hello5.clj

?

Tentativa:

Eu sei que posso gerar os arquivos .clj e .cljs de um diretório via

FOUND_FILES=$(find "dir1" -type f -regex ".*\.\(clj\|cljs\)")

e que eu posso usar o comando basename para obter o nome de base de um arquivo. Como fazer o resto?

    
por George 13.03.2016 / 13:15

2 respostas

2

Você pode fazer isso com globs e expansão do parâmetro . Você não precisa usar find se tiver uma versão do bash que tenha globstar para ativar a sintaxe ** (bash4 +).

# Enable '**', and expand globs to 0 elements if unmatched
shopt -s globstar nullglob
# Put all files matching *.clj or *.cljs into ${files[@]} recursively
files=(dir1/**/*.clj{,s})
# Print all files delimited by newlines, with all leading directories stripped
printf '%s\n' "${files[@]##*/}"

Para aplicar alguma transformação arbitrária, substitua a última linha por:

for file in "${files[@]}"; do
    some-arbitrary-transformation <<< "$file"
done
    
por 13.03.2016 / 13:20
1
shopt -s globstar nullglob
var="$(echo **/*.clj **/*.cljs | xargs -n1 basename)"
echo "$var"
    
por 13.03.2016 / 13:30