
Estou tentando imprimir os nomes de todos os arquivos .txt da pasta atual em uma linha. Estou usando o seguinte script. No entanto, não está imprimindo nomes de arquivos.
REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ+="${name} "
done
echo "Full Sequence: ${REF_SEQ}"
Tenho 3-4 arquivos .txt na minha pasta atual (A.txt, B.txt...). Estou esperando uma saída como
Sequência completa: A.txt B.txt ...
Se eu apenas usar find
o comando sem atribuir a saída à variável RED_SEQ
, obtenho a saída desejada. Isso sugere que o comando find está funcionando bem, mas de alguma forma não consigo atribuí-lo à variável. Tentei vários operadores de atribuição diferentes, mas ainda sem sorte.
Responder1
Para atualizar uma variável em bash
, você deve usar esta sintaxe:
VAR="some stuff$VAR"
Mas, como você está usando um pipe, o while
loop é executado em um sub-shell, sua variável é perdida.
Para corrigir isso, você deve ter a sintaxe:
while read f
do
done <<< $(input)
Então, no seu caso:
REF_SEQ=""
while read f;
do
name=$(echo ${f}| xargs -I {} basename {} )
REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)
echo "Full Sequence: ${REF_SEQ}"
Responder2
O problema é que você usa {} atrás do símbolo de barra vertical. Isso é válido apenas na opção -exec de find, mas não atrás do símbolo de barra vertical.
Você pode tentar o seguinte:
REF_SEQ=$(find. -maxprofundidade 1 -name "*.txt" -type f -printf "%f " | xargs)
Isso deve produzir o resultado que você deseja. A diretiva printf %f exibe o nome base do arquivo encontrado e o xargs "transpõe" o resultado.
Atenciosamente Jürgen