【发布时间】:2011-06-11 00:06:15
【问题描述】:
(使用 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。文件“~/a b c/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,所以通配符不会扩展,但空格会不断破坏文件名,尽管已转义。
任何提示? 谢谢。
【问题讨论】:
标签: bash escaping filenames space