由于文件名可能包含空格和新行\n
,因此我使用空字符作为字段分隔符。但我不知道如何对find
说输入目录是空字符分隔。
我失败的尝试:
foo()
{
IFS='\0'
find "$@"
}
$ mkdir 'oneword' 'two words'
$ IFS='\0' foo $(realpath -z 'oneword' 'two words')
如何告诉find
输入目录是否用零分隔?
答案 0 :(得分:2)
一种方法是使用xargs:
realpath -z 'oneword' 'two words' | xargs -0 find
或者:
foo() {
local A=() I=0 IFS=''
while read -rd $'\0' A[I++]; do :; done
find "${A[@]}"
}
realpath -z 'oneword' 'two words' | foo ## Under subshell or pipe
foo < <(realpath -z 'oneword' 'two words') ## No subshell
如果需要,您可以使用另一个fd:
foo() {
local A=() I=0 IFS=''
while read -rd $'\0' -u 4 A[I++]; do :; done
find "${A[@]}"
}
foo 4< <(realpath -z 'oneword' 'two words')
注意:使用IFS将变量的值拆分为多个参数可能会导致路径名扩展,并且不值得称道。它还需要修改IFS,这可能会影响其他功能。