cp: fts_open: Nenhum arquivo ou diretório / Por quê?

0

Eu tenho seguindo o script bash:

#!/bin/bash

echo "This script will copy all JPG files inside directory '~/temp/merged':";

pwd;

read -r -p "Please confirm, that you want to copy all JPG files [y/N]" response

case $response in
    [yY][eE][sS]|[yY]) 
        find . -iname "*.jpg" -type f -print0 | while IFS= read -d '' f ;

        mkdir -p ~/temp/merged;

        do 
          echo "$f"
          cp "$f" ~/temp/merged/$orig_f
        done 
        ;;
        *)
        ;;
 esac

Isso me dá erros assim no final da execução correta:

cp: fts_open: Nenhum arquivo ou diretório desse tipo

Por quê? Por favor ajude a entender.

    
por dandaka 20.10.2014 / 13:01

1 resposta

1

Eu não posso dizer precisamente qual é o seu problema, mas há vários problemas.

O principal problema que vejo é com esta linha:
cp "$f" ~/temp/merged/$orig_f

Antes de executar o cp, o shell está procurando por uma variável orig_f (que não existe).

Os sublinhados são caracteres válidos em nomes de variáveis, por exemplo, variable_a="value" . Então, se você está tentando prefixar ou anexar uma variável com um sublinhado, é necessário fazer isso: ${variable}_a .

O outro problema é com a citação. Digamos que orig_f exista, o conteúdo pode conter espaços que se expandem e causam problemas. Portanto, certifique-se de citar quaisquer variáveis que possam se expandir como tal.

Você pode simplificar muito seu script usando:

mkdir -p ~/temp/merged
find . -iname "*.jpg" -type f -print -exec cp {} ~/temp/merged \;

Se você precisar usar um loop while, faça isso:

mkdir -p ~/temp/merged
while IFS= read -d '' f; do 
    echo "$f"
    cp "$f" ~/temp/merged
done < <(find . -iname "*.jpg" -type f -print0)
    
por 22.10.2014 / 08:39

Tags