(sedを使用してソリューションで編集)
チルダとワイルドカードを含むファイル名とディレクトリのリストがあります。例えば:
~/docs/file.*
~/my docs/*.txt
...
行を読み取り、コマンド(rsyncなど)に渡します。
while read ROW
do
rsync $ROW /my/dest/
done < list.txt
問題は、ファイル名にスペースを含めることです。$ROWをこのように二重引用符で囲むと
rsync "$ROW" /my/dest/
もちろん、bashはワイルドカードやチルダから逃れることはできません。ただし、引用符を使用しない場合、スペースによって行が分割されます。
考えられる解決策の1つは、IFSを変更することです(注意:スクリプトは、私が報告したものよりも複雑です)。別の解決策(Patrick Echterbruchの修正に感謝)は、スペースを事前にエスケープすることです。ただし、次のコードは私には機能しません。
while read ROW
do
export NEWROW=$(echo $ROW | sed -e 's/ /\\ /g')
echo "Value: $NEWROW"
ls -1d $NEWROW
done < list.txt
引用符はlsに渡されないことに注意してください。ファイル"〜/ abc / test.txt"が存在しますが、次のようになります。
Value: ~/saver/a\ b\ c/*.txt
ls: impossibile accedere a ~/saver/a\: Nessun file o directory
ls: impossibile accedere a b\: Nessun file o directory
ls: impossibile accedere a c/*.txt: Nessun file o directory
NEWROWが文字列としてlsに渡されるように見えるため、ワイルドカードは展開されませんが、スペースはエスケープされますが、ファイル名を壊し続けます。
ヒントはありますか?ありがとう。