xargs/find/grep目录列表中的文件列表



我在一个文本文件中有一个目录列表,我想在其中查找和更改共享特定命名约定的文件。

示例文件:

dir1
dir2
dir3

带有文件的示例文件夹结构

dir1/
   thing.txt
   thing.blah
dir2/
   rar.txt
   thing.blah
dir3/
   apple.txt
   another.text.file.txt
   thing.blah

首先,我找到了.txt的名称,但随后我想对其进行更改。例如,我想对thing.txt、rar.txt和apple.txt执行sed命令,但不想对另一个.text.file.txt执行。

我的问题是,一旦我有了所有的文件名,我该如何对具有这些名称的文件执行命令?然后我该如何处理这些行的文本,例如:

cat dirFile.txt | xargs ls | grep <expression>.txt 
    thing.txt
    rar.txt
    apple.txt
 !cat | some command

并对目录下的实际文件执行操作?

我得到的是上面的结果,

但我需要的是

dir1/thing.txt
dir2/rar.txt
dir3/apple.txt

假设您有一个名为dirs的文件,其中包含您需要搜索的所有目录:

while IFS= read -r i; do
  find "$i" -name '<expression>' -print0
done < dirs | xargs -0 some_command

如果你知道目录没有空格或其他类型的分隔符,你可以简化一点:

find $(<dirs) -name '<expression>' -print0 | xargs -0 some_command

也许您的some_command一次只期望一个文件,在这种情况下使用-n1:

... | xargs -0 -n1 some_command

或者移动some_command以找到自己:

find $(<dirs) -name '<expression>' -exec some_command {} ;
  • CCD_ 5是一个同源取代。它读取dirs文件的内容(如cat),并将其用作find的第一个参数。空dirs在GNU find(如Linux)上是安全的,但在BSD(如Mac OS X)上至少需要一行(转换为一个参数)
  • -print0null分隔文件
  • -0需要这些null个字符
  • -n1表示xargs只向some_command发送一个自变量

我想我的评论没有得到充分表达。以获得您想要的输出;

cat dirfile.txt | xargs -I % find % -name <your file spec> or -regex <exp>

最新更新