我在一个文本文件中有一个目录列表,我想在其中查找和更改共享特定命名约定的文件。
示例文件:
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)上至少需要一行(转换为一个参数) -print0
用null
分隔文件-0
需要这些null
个字符-n1
表示xargs
只向some_command
发送一个自变量
我想我的评论没有得到充分表达。以获得您想要的输出;
cat dirfile.txt | xargs -I % find % -name <your file spec> or -regex <exp>