如何循环遍历由find返回的文件名?
在这个问题中,原始问题是如何通过find返回的文件名进行循环。解决方法是使用while循环和read命令。以下是解决方法的代码:
find . -name "*.txt"|while read fname; do echo "$fname" done
这段代码使用find命令查找当前目录下所有扩展名为.txt的文件,并将它们的文件名通过while循环逐行读取并打印出来。
除了上述解决方法之外,还有其他两种解决方法。第一种是使用-exec参数,如下所示:
find . -name '*.txt' -exec echo "{}" \;
这种方法使用-exec参数将找到的文件名作为占位符{},并使用\;来结束-exec谓词。这将逐个打印找到的文件名。
第二种方法是使用-print0和xargs命令,如下所示:
find . -name '*.txt' -print0|xargs -0 -n 1 echo
这种方法使用-print0参数将打印的文件名以\0字符分隔,然后使用xargs命令逐个获取它们。
需要注意的是,这种解决方法可能会失败,如果文件名包含换行符、反斜杠或以空格结尾。因此,在处理文件名时需要小心。
,通过find返回的文件名进行循环可以使用while循环和read命令、-exec参数或-print0和xargs命令来实现。这些方法可以满足不同的需求,但在处理特殊字符和文件名时需要格外注意。
问题的出现原因:这篇文章是一个关于如何通过find返回的文件名进行循环的指南。作者提供了多种不同的方法和解决方案。文章中提到了一些问题,如文件名中包含空格时可能会导致问题,以及某些方法的局限性。
解决方法:根据作者的建议,可以使用以下方法来循环遍历文件名:
- 使用for循环遍历文件,但不推荐在文件名中包含空格时使用。
- 使用find命令和while循环结合,可以更好地处理文件名中包含空格的情况。
- 使用globstar选项可以在当前目录及其子目录中进行递归的文件名匹配。
- 如果文件名已经在文件中,可以使用read命令进行循环遍历。
- 可以结合使用find命令和read命令来遍历文件名,并设置适当的分隔符。
- 对于更复杂的搜索,可以使用find命令的-exec选项或-print0 | xargs -0结合xargs命令。
还有一些其他相关的问题和注意事项,如使用特定选项来限制find搜索的类型,以及如何处理文件名中包含特殊字符的情况。
本文提供了多种不同的方法和解决方案,用于循环遍历find命令返回的文件名。根据具体情况选择合适的方法,并注意可能出现的问题和限制。
如何循环遍历由find返回的文件名?
在上述内容中,作者解释了为什么不应该使用for循环来处理由find命令返回的文件名。他列举了三个原因:首先,for循环需要等到find命令运行完毕才能开始执行;其次,如果文件名中包含空格或其他空白字符,for循环会将其视为两个不同的文件名;最后,如果返回的文件名总长度超过命令行缓冲区的限制,超过部分将被丢弃。
为了解决这个问题,作者建议始终使用while read结构来处理由find命令返回的文件名。他给出了一个示例代码,使用了-print0和-d $'\0'参数来设置文件名的分隔符为NULL。这样,即使文件名中包含空白字符,也能正确处理。此外,使用while read结构也能避免命令行缓冲区溢出的问题。
文章中还提到了使用find命令的-exec选项来处理文件名的方法,但指出这种方法不适用于同时执行多个命令,也无法使用环境变量或内置命令。对于需要在命令行上快速编写脚本的情况,使用find命令的-exec选项并不方便。作者认为,虽然使用for循环在大多数情况下可能是可行的,但它比使用find | while read要慢得多。
此外,文章中还提到了一些读者的评论和补充意见。有人认为使用-exec选项是最安全的方法,但不适用于同时执行多个命令。还有人指出,使用while read可以处理包含换行符的文件名。还有人建议在使用read命令时加上-r选项,以禁用对反斜杠转义和行连续的解释。
本文通过比较使用for循环和while read结构处理由find命令返回的文件名的方法,解释了为什么应该选择后者。通过使用-print0和-d $'\0'参数,while read结构能够正确处理包含空白字符的文件名,并避免了命令行缓冲区溢出的问题。此外,文章还提到了使用-exec选项处理文件名的方法,以及一些读者的评论和补充意见。