复制整个文件夹内容 - 不仅仅是输出的文件

复制整个文件夹内容 - 不仅仅是输出的文件

我想使用findrsync复制至少包含一个“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目录已存在,但为空。

相关内容