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

时间:2016-05-25 12:14:37

标签: linux bash gnu-findutils

我想在某些dir中查找,并对此目录中的文件执行awk,然后按每个结果替换原始文件。

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

所以我需要在最后一个命令中找到(由find找到的每个文件的文件名)。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

我会使用循环,例如:

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

编辑:正如评论中所述,由于-print0 | xargs -0循环,for的好处会丢失。包含空格的文件名仍然无法正确处理。

以下while循环既不会处理异常的文件名(很好知道它,虽然它不在问题中),但文件名至少有一个标准的空格,所以它的效果更好,确实:< / p>

find . -name "*test*file*" -print > files_list

while IFS= read -r filename
do
    # some process
    echo "what you like" > "$filename"
done < files_list

答案 1 :(得分:0)

可以做这样的事情(但我根本不推荐)。

<input type="text" id="ddlItem_1" ng-disabled="IsReadOnly"           
         typeahead-focus
         ng-model="aiisInstrument" 
         uib-typeahead="aiisInstrument as aiisInstrument.Name for aiisInstrument in AiisInstruments | filter:$viewValue:stateComparator  |  filter : { ValueDomainCategoryTypeId : systemTypeCatgory}" />

这会直接将文件传递给find dir -print0 | xargs -0 -n 2 awk -v OFS='\0' '<process the input and write to temporary file> END {print "temporaryfile", FILENAME}' | xargs -0 -n 2 mv 两个(这可以避免原始文件的问题,awk将同时获得数百个(可能更多)文件作为参数并吐出所有他们在cat的内容一次通过标准输入,因此完全丢失了他们的个人内容和文件名。

然后awk将处理后的输出写入临时文件,然后输出临时文件名和awk选择它们的原始文件名(一次又两次)并运行{{1}在临时文件/原始文件名对上。

正如我在开始时说的那样,这是一种可怕的方法。

如果您有足够新版本的xargs(版本4.1.0或更高版本),那么您可以使用mv的{​​{1}}(就地)参数并使用(我相信):

GNU awk

如果不这样做,我会使用Bash FAQ 001中的-i循环来逐行读取awk输出并在循环中对其进行操作。