我在文本文件中有一个目录列表,其中我想查找和更改共享特定命名约定的文件。
示例文件:
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
答案 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
字符。-n1
说xargs
只向some_command
答案 1 :(得分:1)
我想我的评论没有得到充分表达。获得你想要的输出;
cat dirfile.txt | xargs -I % find % -name <your file spec> or -regex <exp>