Arquivo não encontrado durante a execução de um script sh

0

Atualmente, estou trabalhando em um script de shell para automatizar algumas coisas (copiando arquivos e preservando sua "data de alteração"). Eu testei todos os comandos no meu shell, mas quando eu os executo em um script, eles não se comportam corretamente.

Se eu executar este o meu shell, obtenho o resultado apropriado:

$> filename=/home/root/data/ABCD1234/20170123-231000.wav
$> echo "$filename"
/home/root/data/ABCD1234/20170123-231000.wav
$> cdate=$(date +%Y%m%d%H%M.%S -r $filename)
$> echo $cdate
201701232310.00
$> cp $filename $filename.bck 
touch -t $cdate $filename.bck

Mas quando eu executo o seguinte script:

#!/bin/bash

# list desired files
files=$(find /home/root/data/ABCD1234/*)

# iterate over every file found
for filename in $files
do
    echo "$filename"
    cdate=$(date +%Y%m%d%H%M.%S -r $filename)
    echo $cdate
    cp $filename $filename.bck 
    touch -t $cdate $filename.bck
done

exit 0

Eu recebo a seguinte saída (supondo que haja 2 arquivos nesta pasta)

/home/root/data/ABCD1234/20170123-231000.wav
': No such file or directory/data/ABCD1234/20170123-231000.wav

/home/root/data/ABCD1234/20170123-231500.wav
': No such file or directory/data/ABCD1234/20170123-231500.wav

PS: Estou usando uma distribuição ARAGO e a maioria dos comandos shell são redirecionados para o BusyBox.

PS: No meu script original eu não estou realmente copiando arquivos, então manter o timestamp no comando cp não vai resolver o meu problema.

    
por Jonas 25.01.2017 / 13:57

2 respostas

1

O problema é com a citação da variável $files . Ele irá atribuir todos os nomes de arquivos de uma vez para filename .

Se você estiver interessado apenas nos arquivos *.wav em /home/root/data/ABCD1234/ , faça isso:

for filename in /home/root/data/ABCD1234/*.wav
do
    echo "$filename"
    cdate="$( date +%Y%m%d%H%M.%S -r "$filename" )"
    echo "$cdate"
    cp "$filename" "$filename.bck"
    touch -t "$cdate" "$filename.bck"
done

Usando find :

find /home/root/data/ABCD1234/  other options  |
while read -r filename; do
  # loop as before
done
    
por 25.01.2017 / 14:41
0

O problema só pode vir da variável "files", já que o script de @Kusalananda funciona perfeitamente quando "find" é usado para preenchê-lo.

Acontece que essa string pode ter CR-LF em vez de LF (a ferramenta que usei era uma porta de um programa Windows C ++).

A remoção do CR na variável resolveu o problema. Para remover, usei a seguinte linha antes do loop for

files=${files//[$'\t\r\n']}
    
por 26.01.2017 / 14:03