我想按文件扩展名和文本进行搜索,然后将二进制文件复制到同一文件夹中。例如,我在目录中A
,最后想将所有*.gdx
文件(在B
、C
、中D
)复制到某个地方。
A
|-- B
| |-- file1.out (a text file)
| |-- file1.gdx (a binary file)
|
|-- C
| |-- file2.out (a text file)
| |-- file2.gdx (a binary file)
|
|-- D
| |-- file3.out (a text file)
| |-- file3.gdx (a binary file)
这是我的代码:
cd 'find . -maxdepth 2 -name "*.out"|xargs grep "sometext"| awk -F'/' '{print $2}'|sort -u ' && ' find . -maxdepth 2 -name "*.gdx" -print0|xargs -0 cp -t /somewhere'
问题就在这里,如果第一的 find
捕获多个文件夹,然后仅复制*.gdx
第一个文件夹中的一个文件,而不是*.gdx
所有文件夹中的所有文件。我相信它必须通过循环完成,但不知道如何编写脚本。
答案1
和find
:
find . -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
-exec sh -c 'cp "$1" "${1%.out}.gdx" /somewhere' sh {} ';'
或者:
find . -type f -name '*.out' -exec grep -q 'PATTERN' {} ';' \
-exec sh -c 'for name do cp "$name" "${name%.out}.gdx" /somewhere; done' sh {} +
这将查找当前文件夹或以下文件夹中名称以.out
.如果.out
文件中有匹配的行PATTERN
,则与该文件.gdx
同目录下、具有相同名称前缀的文件将与该文件一起.out
复制到其中。/somewhere
.out
不会测试是否已存在/somewhere
与正在复制的文件同名的现有目录条目,或者该.gdx
文件是否实际存在。
也可以看看: