私は現在、いくつかのタスクを自動化するためにシェルスクリプトを使用しています(ファイルをコピーして「変更された日付」を保持)。シェルですべてのコマンドをテストしましたが、スクリプトで実行すると正しく機能しません。
シェルで実行すると、適切な結果が得られます。
$> 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
PS:私はARAGOディストリビューションを使用しており、ほとんどのシェルコマンドはBusyBoxにリダイレクトされます。
PS:元のスクリプトは実際にファイルをコピーしていないので、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']}