Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

1. Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 21/08/2017 - 22:26h

como faço para atribuir o resultado do comando "find" (que contém arquivos com espaço) à uma variável?

a dificuldade é que quando o nome do arquivo contém espaços, então, cada parte do nome do arquivo acaba por ser interpretado como se fosse um arquivo. assim, cada parte do nome do arquivo é armazenado em uma linha da variável.

o que quero é que cada nome de arquivo retornado pelo comando "find" (mesmo aqueles que contém espaço em seus nomes) fique armazenado em uma linha da variável.

mesmo colocando o nome do arquivo entre aspas por meio do comando "sed" não consegui fazer o comando "find" retornar para cada linha um nome do arquivo completo.

por exemplo...:
count=0
for i in $(find . -iname "*.zip" -o -iname "*.rar" | sed 's/^\|$/\"/g')
do
cmdlst[$count]=$i
echo ${cmdlst[$count]}
let count=$count+1
done

com este código, se o diretório contiver apenas dois arquivos, mas com nomes que contenham um espaço, então, o laço "for" ao invés de ter duas repetições terão quatro repetições: uma repetição para cada parte do nome do arquivo.



  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/08/2017 - 12:26h

Boa tarde.
Uma opção é usando o descritor de arquivos, segue exemplo:

exec 3< <(find Documents/ -type f -iname "*")
while read arq <&3; do
echo \"${arq}\"; done
exec 3<&-

"Documents/Novo arquivo vazio3"
"Documents/Novo arquivo vazio2"
"Documents/Novo arquivo vazio1"

Obs: se a resposta foi satisfatória, marque o tópico como resolvido e escolha a MELHOR RESPOSTA!
Att.:
marcelo oliver

3. Re: Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 26/08/2017 - 12:37h

msoliver escreveu:

Uma opção é usando o descritor de arquivos, segue exemplo:

exec 3< <(find Documents/ -type f -iname "*")
while read arq <&3; do
echo \"${arq}\"; done
exec 3<&-

"Documents/Novo arquivo vazio3"
"Documents/Novo arquivo vazio2"
"Documents/Novo arquivo vazio1"

msoliver, resolve meu problema o "descritor de arquivos"!

por tabela resolve um outro: em que costumava criar um arquivo temporário para fazer algumas operações...

agora, poderei utilizar o "descritor de arquivos" para fazer as operações..

obrigado!




4. Re: Atribuir resultado do comando

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 26/08/2017 - 15:45h

algo que percebi agora com o uso do "descritor de arquivo"...

não funciona com o "sh".

se a primeira linha do script for:
#!/bin/sh 
aí não funciona.

é preciso que tenha a chamada ao bash:
#!/bin/bash 
ou então sem nada especificado de qual será o interpretador (neste caso, o interpretador utilizado será aquele que estiver setado como interpretador padrão na variável "$SHELL")


5. Re: Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 26/08/2017 - 18:05h

raserafim escreveu:

algo que percebi agora com o uso do "descritor de arquivo"...

não funciona com o "sh".

se a primeira linha do script for:
#!/bin/sh 
aí não funciona.

é preciso que tenha a chamada ao bash:
#!/bin/bash 
ou então sem nada especificado de qual será o interpretador.


Boa noite Serafim, sinceramente, nunca havia notado, pois, somente uso o "bash".
É provável que o "sh" tenha alguma particularidade.
De uma verificada no "man sh"

mso


6. Re: Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 28/08/2017 - 10:55h

msoliver escreveu:

Boa noite Serafim, sinceramente, nunca havia notado, pois, somente uso o "bash".
É provável que o "sh" tenha alguma particularidade.
De uma verificada no "man sh"
pois é msoliver...

até onde sei (mas sem certeza) o "sh" é um interpretador de comandos mais simples (elementar) do que o "bash".

nesse sentido, provavelmente, o "sh" não teria suporte à função "descritor de arquivos"...




7. Re: Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 28/08/2017 - 12:33h

raserafim escreveu:

como faço para atribuir o resultado do comando "find" (que contém arquivos com espaço) à uma variável?

a dificuldade é que quando o nome do arquivo contém espaços, então, cada parte do nome do arquivo acaba por ser interpretado como se fosse um arquivo. assim, cada parte do nome do arquivo é armazenado em uma linha da variável.

o que quero é que cada nome de arquivo retornado pelo comando "find" (mesmo aqueles que contém espaço em seus nomes) fique armazenado em uma linha da variável.


encontrei uma outra alternativa...

talvez seja um pouco gambiarra... mas funcionou..!

segue...:
count=0
for i in $(find . -maxdepth 1 -type f -iname "*.zip" -o -iname "*.rar" | sed 's/ /EsPaÇo/g')
do
cmdlst[$count]=$(echo $i | sed 's/EsPaÇo/ /g')
echo ${cmdlst[$count]}
let count=$count+1
done




8. Re: Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 29/08/2017 - 09:20h

é curioso que quando se joga o resultado do comando "find" para uma variável, então, cada espaço retornado na linha é interpretado como um fim de linha... (esse comportamento é que me traz problemas...)

porém, quando se joga o resultado do comando "find" para um arquivo ou para o descritor de arquivos, então, cada linha é interpretada corretamente independente de quantos espaços existam na linha... (esse comportamento resolve meus problemas!) (a questão é que eu gostaria de armazenar o resultado do comando find em uma variável...)



9. Re: Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/08/2017 - 13:53h

raserafim escreveu:

é curioso que quando se joga o resultado do comando "find" para uma variável, então, cada espaço retornado na linha é interpretado como um fim de linha... (esse comportamento é que me traz problemas...)

porém, quando se joga o resultado do comando "find" para um arquivo ou para o descritor de arquivos, então, cada linha é interpretada corretamente independente de quantos espaços existam na linha... (esse comportamento resolve meus problemas!) (a questão é que eu gostaria de armazenar o resultado do comando find em uma variável...)

O problema ocorre, devido a var "IFS" (internal field separator), veja:
ls -1 *.txt
Arquivo Novo_1.txt
Arquivo Novo_2.txt
Arquivo Novo_3.txt

for ARQ in $(ls -1 *.txt);do echo "$ARQ";done
Arquivo
Novo_1.txt
Arquivo
Novo_2.txt
Arquivo
Novo_3.txt

Setando IFS para "\n"
OIFS="$IFS" #"guarda" o valor antigo de IFS
IFS="\n"
for ARQ in $(ls -1 *.txt);do echo "$ARQ";done
Arquivo Novo_1.txt
Arquivo Novo_2.txt
Arquivo Novo_3.txt
IFS="$OIFS"


Att.:
MSO




10. Re: Atribuir resultado do comando "find" (arquivos com espaço) à uma variável [RESOLVIDO]

Rodrigo Albuquerque Serafim
raserafim

(usa Slackware)

Enviado em 29/08/2017 - 16:10h

msoliver escreveu:

O problema ocorre, devido a var "IFS" (internal field separator), veja:
ls -1 *.txt
Arquivo Novo_1.txt
Arquivo Novo_2.txt
Arquivo Novo_3.txt

for ARQ in $(ls -1 *.txt);do echo "$ARQ";done
Arquivo
Novo_1.txt
Arquivo
Novo_2.txt
Arquivo
Novo_3.txt

Setando IFS para "\n"
OIFS="$IFS" #"guarda" o valor antigo de IFS
IFS="\n"
for ARQ in $(ls -1 *.txt);do echo "$ARQ";done
Arquivo Novo_1.txt
Arquivo Novo_2.txt
Arquivo Novo_3.txt
IFS="$OIFS"

interessante...

poderia ser a solução para alguns problemas que tenho buscado...

por exemplo, o meu problema inicial que você me ajudou a superar utilizando o recurso do "descritor de arquivos".

com essa sua nova explicação poderia simplesmente setar o IFS="\n" e, então, utilizar normalmente o meu código com o "find"...

no entanto, por algum motivo, não consegui fazer funcionar.... o array não ficou preenchido corretamente... a quantidade de ciclos do laço também não correspondeu ao que deveria (o ciclo foi menor do que a quantidade de arquivos)..




11. Re: Atribuir resultado do comando

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/08/2017 - 18:34h

raserafim escreveu:

msoliver escreveu:

O problema ocorre, devido a var "IFS" (internal field separator), veja:
ls -1 *.txt
Arquivo Novo_1.txt
Arquivo Novo_2.txt
Arquivo Novo_3.txt

for ARQ in $(ls -1 *.txt);do echo "$ARQ";done
Arquivo
Novo_1.txt
Arquivo
Novo_2.txt
Arquivo
Novo_3.txt

Setando IFS para "\n"
OIFS="$IFS" #"guarda" o valor antigo de IFS
IFS="\n"
for ARQ in $(ls -1 *.txt);do echo "$ARQ";done
Arquivo Novo_1.txt
Arquivo Novo_2.txt
Arquivo Novo_3.txt
IFS="$OIFS"

interessante...

poderia ser a solução para alguns problemas que tenho buscado...

por exemplo, o meu problema inicial que você me ajudou a superar utilizando o recurso do "descritor de arquivos".

com essa sua nova explicação poderia simplesmente setar o IFS="\n" e, então, utilizar normalmente o meu código com o "find"...

no entanto, por algum motivo, não consegui fazer funcionar.... o array não ficou preenchido corretamente... a quantidade de ciclos do laço também não correspondeu ao que deveria (o ciclo foi menor do que a quantidade de arquivos)..

Serafim, segue mais uma dica:
O comando abaixo vai gerar um "ARRAY" com todos arquivos "txt" do diretório.
Conteúdo do diretório:
ls -1 *.txt
Arquivo Novo 10.txt
Arquivo Novo 1.txt
Arquivo Novo 2.txt
Arquivo Novo 3.txt
Arquivo Novo 4.txt
Arquivo Novo 5.txt
Arquivo Novo 6.txt
Arquivo Novo 7.txt
Arquivo Novo 8.txt
Arquivo Novo 9.txt

OIFS="$IFS";IFS=" " read -a ARQ <<< $(ls -1 *.txt|sed 's/ /\[ESP\]/g'|xargs) 

printf "%s\n" "${ARQ[@]}"
Arquivo[ESP]Novo[ESP]10.txt
Arquivo[ESP]Novo[ESP]1.txt
Arquivo[ESP]Novo[ESP]2.txt
Arquivo[ESP]Novo[ESP]3.txt
Arquivo[ESP]Novo[ESP]4.txt
Arquivo[ESP]Novo[ESP]5.txt
Arquivo[ESP]Novo[ESP]6.txt
Arquivo[ESP]Novo[ESP]7.txt
Arquivo[ESP]Novo[ESP]8.txt
Arquivo[ESP]Novo[ESP]9.txt

Eliminando o [ESP]
printf "%s\n" "${ARQ[@]}"|sed 's/\[ESP\]/ /g'
Arquivo Novo 10.txt
Arquivo Novo 1.txt
Arquivo Novo 2.txt
Arquivo Novo 3.txt
Arquivo Novo 4.txt
Arquivo Novo 5.txt
Arquivo Novo 6.txt
Arquivo Novo 7.txt
Arquivo Novo 8.txt
Arquivo Novo 9.txt

OBS.: Qdo alterar o valor de "IFS", retorne p/ o valor original.

IFS="$OIFS"
Att.:
MSO








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts