Bash para processamento de arquivos [duplicado]

0

Estou escrevendo um script para mover todas as imagens para um arquivo central.

Eu crio a lista de arquivos de imagem com:

img_fil='/home/files/img_dump.txt'
locate -i image | grep \.jpg > "$img_fil"
locate -i image | grep \.jpeg >> "$img_fil"
locate -i image | grep \.gif >> "$img_fil"
locate -i image | grep \.tif >> "$img_fil"
locate -i image | grep \.png >> "$img_fil"

Mas quando eu começo a processar o arquivo de despejo para isso, a maioria dos caminhos contém espaços em branco, então isso não funciona:

while read -r fline
do
   if [ ! -e "$fline" ]; then
      echo "F=> $fline"
      mv "$fline" "$img_dir"
   else
      fpath="$(dirname $fline)"
      fname="$(basename $fline)"
      echo "F=> $fname P=> $fpath"
   fi 
done

O dirname e basename sempre analisam os espaços em branco, portanto, não serão processados corretamente.

Como faço para que isso funcione?

    
por OldManRiver 25.02.2018 / 22:17

2 respostas

2

fpath="$(dirname $fline)"
fname="$(basename $fline)"

Aqui, você precisa citar $fline dentro da substituição do comando. (Fora não importa, já que está em uma tarefa.) Então:

fpath=$(dirname -- "$fline")

ou

fpath=${fline%/*}

(Apesar de observar as pequenas diferenças entre dirname / basename e as expansões de parâmetros, consulte: dirname e basename vs expansão de parâmetros )

    
por 25.02.2018 / 22:46
0

Onde você está usando $img_fil no seu script? Não deveria a linha done ser done < "$img_fil" ?

    
por 25.02.2018 / 22:30