sh 스크립트를 실행할 때 파일을 찾을 수 없습니다

sh 스크립트를 실행할 때 파일을 찾을 수 없습니다

저는 현재 일부 작업을 자동화하기 위해 쉘 스크립트를 사용하고 있습니다(파일을 복사하고 "변경된 날짜" 유지). 셸에서 모든 명령을 테스트했지만 스크립트에서 실행하면 올바르게 작동하지 않습니다.

쉘에서 실행하면 적절한 결과를 얻습니다.

$> 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

하지만 다음 스크립트를 실행하면:

#!/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

다음 출력을 얻습니다(이 폴더에 2개의 파일이 있다고 가정).

/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

추신: 저는 ARAGO 배포판을 사용하고 있으며 대부분의 쉘 명령은 BusyBox로 리디렉션됩니다.

추신: 원본 스크립트에서는 실제로 파일을 복사하지 않았으므로 cp 명령에 타임스탬프를 유지해도 문제가 해결되지 않았습니다.

답변1

문제는 $files변수 참조에 있습니다. 모든 파일 이름을 할당합니다즉시도착하다 filename.

*.wav의 파일에만 관심이 있는 경우 /home/root/data/ABCD1234/다음을 수행할 수 있습니다.

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

사용 find:

/home/root/data/ABCD1234/ 찾기  다른 옵션  |
읽는 동안 -r 파일 이름;
  #이전처럼 루프
완벽한

답변2

@Kusalananda의 스크립트는 "find"로 채울 때 완벽하게 작동하기 때문에 문제는 "files" 변수에서만 발생할 수 있습니다.

이 문자열은 LF 대신 CR-LF를 가질 수 있다는 것이 밝혀졌습니다(제가 사용한 도구는 Windows C++ 프로그램의 포트입니다).

변수에서 CR을 제거하면 문제가 해결되었습니다. 삭제하려면 for 루프 앞에 다음 줄을 사용했습니다.

files=${files//[$'\t\r\n']}

관련 정보