路径名中的空格会给Bash中的Find带来麻烦。有什么简单的解决办法吗?
有没有办法更改以下字符串,以便在文件/文件夹中有空格时不会出现任何问题路径名中的空格会给Bash中的Find带来麻烦。有什么简单的解决办法吗?,bash,find,Bash,Find,有没有办法更改以下字符串,以便在文件/文件夹中有空格时不会出现任何问题 files=`find ~/$folder -name "*@*" -type f` 我更希望有一个解决方案,它不需要改变我的代码的其他部分,但这行代码,因为除了这个小细节之外,一切似乎都正常工作 谢谢 编辑:下面是更详细的代码: abc=( $(find "$pasta" -name "$ficheiro_original@*" -type f) ) abc_length=${#abc[@]} 如果以后在脚本中不使用这
files=`find ~/$folder -name "*@*" -type f`
我更希望有一个解决方案,它不需要改变我的代码的其他部分,但这行代码,因为除了这个小细节之外,一切似乎都正常工作
谢谢
编辑:下面是更详细的代码:
abc=( $(find "$pasta" -name "$ficheiro_original@*" -type f) )
abc_length=${#abc[@]}
如果以后在脚本中不使用这些文件名,只需迭代它们并动态处理即可
find ~/$folder -name "*@*" -type f | while read -r FILE
do
echo "do you stuff"
done
否则,您可以设置IFS
IFS=$'\n'
files=$(find ~/$folder -name "*@*" -type f)
更新:
$ IFS=$'\n'
$ a=($(find . -type f ))
$ echo ${#a[@]}
14
如果您需要一个文件列表,这些文件的名称中可能有空格,那么您几乎必须将它们存储为一个数组,而不仅仅是一个字符串。使用以下内容创建阵列:
saveIFS="$IFS"; IFS=$'\n'; files=( $(find ~/"$folder" -name "*@*" -type f) ); IFS="$saveIFS"
然后,您必须修改脚本的其余部分,将文件用作数组而不是字符串,并且它(和其他文件名)应始终使用双引号,以防止空格被误认为分隔符。例如,在您当前使用的任何位置,$files
,将其替换为“${files[@]}”
您必须进行一些更改,但要处理任意名称,请考虑使用GNU查找选项
-print0
,等等
分隔符的空字符串表示“使用零字节ASCII NUL作为分隔符”,适用于解析“find…”-打印0输出。(谢谢你的提示。)
这允许您读取任意名称。您可能应该使用bash数组来保存名称,但这意味着在脚本的后面会有一些更改
(考虑到只有空格才需要担心的注释响应,这可能是过分的,尽管使用read
处理带有名称的行是操作的关键部分,使用数组可能会使操作更简单。)下面是另一种不用更改其余代码的方法:
# files=($(find))
eval "files=($(find -printf '"%h/%f" '))"
for f in "${files[@]}"; do
echo "$f"
done
它是脏的,不适用于带有特殊字符的文件名,例如“
。它使用eval
来计算Bash数组的字符串,并使用的-printf
来形成该字符串
我个人更喜欢更改$IFS
,仅供参考。要将带空格的文件名读入Bash数组变量,还可以使用“read”内置命令:
printf '%q\n' "$IFS"
IFS=$'\n' read -r -d "" -a abc <<< "$(find ~/$folder -name "*@*" -type f)"
IFS=$'\n' read -r -d "" -a abc < <(find ~/$folder -name "*@*" -type f) # alternative
abc_length=${#abc[@]}
for ((i=1; i <= ${#abc[@]}; i++)); do echo "$i: ${abc[i-1]}"; done
printf '%q\n' "$IFS"
printf'%q\n'$IFS“
IFS=$'\n'读取-r-d““-abc设置IFS将出现问题,即abc_长度将为1,这是不需要的。IFS='$\n'将对我起作用,但代价是使其余代码不起作用,因为当我尝试迭代find的结果时,所有结果将仅作为一个字符串。我对您的设置的复制必须不完整。”。需要查看一个完整的失败示例,包括要深入研究的find
的文件名和目录名、问题脚本的简化和调用参数(或直接将它们放入find
调用中)。美元符号在引号之外:$'\n'
您只是在处理空格吗,或者你需要担心退格、制表符、换行符、表单提要等吗?我只需要处理空格。@Dennis:没有空值-好;我没想过要尝试…是的,它看起来确实有效;比在脚本中嵌入空值要整洁得多。我没有看到我正在查看的文档(bash参考手册)中所述的内容,这是一个PDF格式的bash 4.x版本。谢谢
find ~/$folder -name "*@*" -type f -print0 |
while read -d '' file
do
echo "<<$file>>"
done
# files=($(find))
eval "files=($(find -printf '"%h/%f" '))"
for f in "${files[@]}"; do
echo "$f"
done
printf '%q\n' "$IFS"
IFS=$'\n' read -r -d "" -a abc <<< "$(find ~/$folder -name "*@*" -type f)"
IFS=$'\n' read -r -d "" -a abc < <(find ~/$folder -name "*@*" -type f) # alternative
abc_length=${#abc[@]}
for ((i=1; i <= ${#abc[@]}; i++)); do echo "$i: ${abc[i-1]}"; done
printf '%q\n' "$IFS"