通过Bash循环读取空分隔的字符串

时间:2011-12-30 08:21:57

标签: bash delimiter null-character

我想迭代一个文件列表而不关心文件名可能包含哪些字符,所以我使用一个由空字符分隔的列表。代码将更好地解释。

# Set IFS to the null character to hopefully change the for..in
# delimiter from the space character (sadly does not appear to work).
IFS=$'\0'

# Get null delimited list of files
filelist="`find /some/path -type f -print0`"

# Iterate through list of files
for file in $filelist ; do
    # Arbitrary operations on $file here
done

以下代码在从文件读取时有效,但我需要从包含文本的变量中读取。

while read -d $'\0' line ; do
    # Code here
done < /path/to/inputfile

2 个答案:

答案 0 :(得分:63)

在bash中你可以使用here-string

while IFS= read -r -d '' line ; do
    # Code here
done <<<"$var"

请注意,您应该内联IFS=并使用-d ''但请确保'd'和第一个单引号之间有空格。另外,添加-r标志以忽略转义。

此外,这不是您问题的一部分,但我可以建议您在使用find时更好地处理脚本;它使用流程替换。

while IFS= read -r -d '' file; do
    # Arbitrary operations on "$file" here
done < <(find /some/path -type f -print0)

答案 1 :(得分:0)

我尝试使用上面的bash示例,最后放弃了,并使用了Python,这是第一次使用。事实证明,问题在shell之外更简单。我知道这可能不是bash解决方案的主题,但无论如何我都会在这里发帖,以防其他人想要替代方案。

import sh
import path
files = path.Path(".").files()
for x in files:
    sh.cp("--reflink=always", x, "UUU00::%s"%(x.basename(),))
    sh.cp("--reflink=always", x, "UUU01::%s"%(x.basename(),))