저는 현재 일부 작업을 자동화하기 위해 쉘 스크립트를 사용하고 있습니다(파일을 복사하고 "변경된 날짜" 유지). 셸에서 모든 명령을 테스트했지만 스크립트에서 실행하면 올바르게 작동하지 않습니다.
쉘에서 실행하면 적절한 결과를 얻습니다.
$> 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']}