(使用 sed 编辑解决方案)
我有一个文件名和目录列表,包括波浪号和通配符。例如:
~/docs/file.*
~/my docs/*.txt
...
我读取了这些行并将它们传递给一个命令(例如 rsync):
while read ROW
do
rsync $ROW /my/dest/
done < list.txt
问题是处理文件名中的空格。如果我像这样将 $ROW 放在双引号中
rsync "$ROW" /my/dest/
当然 bash 不会逃脱通配符或波浪号。但如果我不使用引号,空格会中断行。
一种可能的解决方案是更改 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 ,因此通配符不会扩展,但空格会不断破坏文件名,尽管已转义。
任何提示?谢谢。