通过文件扩展名查找目录并复制/移动到其他地方

通过文件扩展名查找目录并复制/移动到其他地方

我想按文件扩展名和文本进行搜索,然后将二进制文件复制到同一文件夹中。例如,我在目录中A,最后想将所有*.gdx文件(在BC、中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文件是否实际存在。

也可以看看:

相关内容