可以将查找到的文件的文件名推送到管道中吗



我想在一些dir中进行查找,并在此目录中的文件上进行awk,然后用每个结果替换原始文件。

find dir | xargs cat | awk ... | mv ... > filename

所以我需要最后一个命令中的文件名(通过find找到的每个文件的文件名)。我该怎么做?

我会使用一个循环,比如:

for filename in `find . -name "*test_file*" -print0 | xargs -0`
do
# some processing, then
echo "what you like" > "$filename"
done

EDIT:正如评论中所指出的,-print0 | xargs -0的好处由于for循环而丧失。并且包含空白的文件名仍然没有得到正确处理。

下面的while循环也不会处理不寻常的文件名(很高兴知道这一点,尽管这不是问题),但至少会处理带有标准空白的文件名,所以它确实工作得更好:

find . -name "*test*file*" -print > files_list
while IFS= read -r filename
do
# some process
echo "what you like" > "$filename"
done < files_list

可以这样做(但我根本不建议这样做)。

find dir -print0 |
xargs -0 -n 2 awk -v OFS='' '<process the input and write to temporary file>
END {print "temporaryfile", FILENAME}' |
xargs -0 -n 2 mv

这一次将文件直接传递给awk两个(这避免了原始文件的问题,即cat将同时获得数百个(可能更多)文件作为参数,并通过标准输入将其内容一次性吐出所有awk,从而完全丢失其单个内容和文件名)。

然后,它让awk将处理后的输出写入临时文件,然后输出临时文件名和原始文件名,其中xargs拾取它们(一次两个),并在临时文件/原始文件名对上运行mv

然而,正如我一开始所说,这是一种可怕的方式。

如果你有一个足够新的GNU awk版本(4.1.0或更新版本),那么你可以对awk使用-i(就地)参数,并使用(我相信):

find dir | xargs awk -i '......'

否则,我将使用Bash FAQ 001中形式的while循环逐行读取find输出,并在循环中对其进行操作。

相关内容

  • 没有找到相关文章

最新更新