复制目录结构将命令应用于每个文件而不是简单地复制它?

Tom*_* M. 5 xargs filter conversion

随着时间的推移,我一次又一次地遇到相同的模式:我有某种目录结构:

example/
??? a
?   ??? c
?       ??? d.txt (120k)
?       ??? e.txt (60k)
??? b
    ??? f.txt (280k)
Run Code Online (Sandbox Code Playgroud)

我想将文件“复制”到另一个目录,例如,example_grepped对每个目录应用一个命令,就像代替cp-grep ERROR比如说,我最终得到一个具有相同结构的文件夹,但文件通过grep.

example_grepped/
??? a
?   ??? c
?       ??? d.txt (1k)
?       ??? e.txt (0b)
??? b
    ??? f.txt (12k)
Run Code Online (Sandbox Code Playgroud)

用于转换媒体文件(FLAC 到 MP3,PNG 到 JPG)的相同模式,这一次在作为构建过程的一部分转换不同的模式格式时。

有我可以使用的通用命令吗?像foobar example example_grepped --command 'grep ERROR'foobar flacs mp3s --command 'ffmpeg -i {} {}.mp3'

xargs也许是一面不起眼的旗帜?(一find管道通过xargs几乎足够了,但如果不是所有的命令期望的目录结构已经存在。)

Goh*_*ohu 0

我可以找到的最接近的答案,无需单独重新创建目录结构,就是使用install

cd example
find . -type f -exec sh -c 'grep ERROR {} | install -D /dev/stdin /tmp/example_grepped/{}' \;
Run Code Online (Sandbox Code Playgroud)

不幸的是,只有当您的命令可以将其结果抛出到 STDOUT 时,上述内容才有效。