for X in $(find ~/Documents/ -type f);do date -r "${X}";done
当“/Documents/”中的文件名不包含空格时,上面的行工作正常。
但是,如果文件名中包含空格,则会出现以下错误:
No such file or directory
我怎样才能让它适用于包含空格的文件名?
for X in $(find ~/Documents/ -type f);do date -r "${X}";done
当“/Documents/”中的文件名不包含空格时,上面的行工作正常。
但是,如果文件名中包含空格,则会出现以下错误:
No such file or directory
我怎样才能让它适用于包含空格的文件名?
不要使用循环,使用
-exec
参数find
:是的。
find
这是使用和循环的众所周知的问题之一。解决它的一种简单方法是将找到的列表转储到标准输出中,然后
read
:如果您的命令足够小,您可以只使用
-exec
key offind
:for
你不能,这就是为什么你从不使用这种方式循环返回文件名的命令输出的原因之一。也称为Bash Pitfall Number 1。如果您改用while
循环,则可以很好地处理带空格的文件:但是,对于包含换行符的文件名,这仍然会失败:
为了解决这个问题,并假设您的
find
实现支持它,您可以使用-print0
打印以 null 结尾的行,然后使用一个使用 NUL 字节作为分隔符的循环。像这样:也就是说,到目前为止,最好的方法是使用 find's
-exec
,它与 POSIX 和可移植性不同-print0
,并且还可以很好地处理任意文件名: