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

时间:2016-04-27 21:39:33

标签: bash grep find command-line-interface

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

示例文件:

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命令,但不能在another.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

2 个答案:

答案 0 :(得分:1)

假设您有一个名为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 {} \;
  • $(<dirs)comand substitution。它读取cat文件的内容(如dirs),并将其用作find的第一个参数。空dirs在GNU查找(例如Linux)上是安全的,但在BSD上至少需要一行 - 它被转换为一个参数 - (例如Mac OS X)
  • -print0将文件与null
  • 分开
  • -0期待这些null字符。
  • -n1xargs只向some_command
  • 发送一个参数

答案 1 :(得分:1)

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

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