我无法在这里或其他任何地方找到这个看似简单问题的解决方案。我想获取嵌套目录中所有文件的路径,在它们周围添加引号,并在bash脚本中循环它们。目录名称和文件中可以包含空格。到目前为止,我没有尝试过任何正常引用的路径字符串总是在空格处被分解。
test.sh
for var in "$@"
do
echo "$var"
done
我尝试从每行一个路径的文件中读取,包括单引号和双引号:
find "nested directory with spaces" -type f | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' '\n' > list.txt # double quotes
./test.sh `cat list.txt`
find "nested directory with spaces" -type f | sed -e 's/^/'\''/g' -e 's/$/'\''/g' | tr '\n' ' ' > list.txt # single quotes
./test.sh `cat list.txt`
并使用引用路径,单引号和双引号之间的空格命令替换:
./test.sh `find "nested directory with spaces" -type f | sed -e 's/^/"/g' -e 's/$/"/g' | tr '\n' ' '` # double quotes
./test.sh `find "nested directory with spaces" -type f | sed -e 's/^/'\''/g' -e 's/$/'\''/g' | tr '\n' ' '` # single quotes
只需从命令行回显引用路径即可得到所需的结果。脚本中缺少什么可以将参数解析为完整的字符串?
答案 0 :(得分:4)
请改为:
find "nested directory with spaces" -type f -exec ./test.sh {} +
这将使用多个参数调用test.sh
,而不会拆分文件名中的空格。
如果您的find
版本不支持+
,那么您可以改为使用\;
,但会为每个参数调用./test.sh
一次。
例如,给定脚本:
#!/bin/sh
echo start
for i; do
echo file: "$i"
done
+
和\;
之间的差异:
$ find a\ b.txt date.txt -exec ./test.sh {} +
start
file: a b.txt
file: date.txt
$ find a\ b.txt date.txt -exec ./test.sh {} \;
start
file: a b.txt
start
file: date.txt