我想使用find
并rsync
复制至少包含一个“wav”文件的任何目录。如果存在“wav”文件,复制应复制整个文件夹。到目前为止我有这个:
find . -name "*.wav" | rsync -armR --include="*/" --include="*.wav" --exclude="*" /users/lukew/desktop/merged /users/lukew/desktop/123;
这很好,因为输出作为单个“wav”文件分发到输出级别的正确目录中。我还希望同时包含源目录中的其他文件,以便与输出目录中的“wav”文件一起包含。
答案1
您需要弄清楚哪些目录包含.wav
文件:
find . -type d \
-exec sh -c 'set -- "$1"/*.wav; [ -e "$1" ]' sh {} ';' \
-print
这将遍历所有目录并尝试所有目录中的.
glob 模式。*.wav
如果模式未展开,则我们假设那里没有文件(如果目录中.wav
存在具有字面名称的文件并且同一目录中没有其他文件,则此操作将失败)。*.wav
.wav
然后我们可以合并rsync
到上面的命令来同步这些目录:
find . -type d \
-exec sh -c 'set -- "$1"/*.wav; [ -e "$1" ]' sh {} ';' \
-exec rsync -a {} /path/to/destination/ ';'
/path/to/destination
这将为每个发现包含文件的目录创建一个子目录.wav
。
测试:
$ tree Source
Source
|-- A
| |-- a.wav
| |-- hs.doc
| `-- hy.xls
|-- B
| |-- hs.doc
| `-- py.xls
`-- C
|-- CA
| |-- d.wav
| |-- h.doc
| `-- h.xls
`-- CB
|-- h.doc
`-- hd.xls
5 directories, 10 files
运行命令:
$ find Source -type d -exec sh -c 'set -- "$1"/*.wav; [ -e "$1" ]' sh {} ';' -exec rsync -a {} Dest/ ';'
检查结果:
$ tree Dest
Dest
|-- A
| |-- a.wav
| |-- hs.doc
| `-- hy.xls
`-- CA
|-- d.wav
|-- h.doc
`-- h.xls
2 directories, 6 files
该Dest
目录已存在,但为空。