Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
路径名中的空格会给Bash中的Find带来麻烦。有什么简单的解决办法吗?_Bash_Find - Fatal编程技术网

路径名中的空格会给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"