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

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']}

関連情報