如何使用 rsync 排除数字目录?

如何使用 rsync 排除数字目录?

我知道 rsync 有一个--exclude我经常使用的选项。但是我如何指定它应该排除所有“数字”目录?

在下面列出的目录中,我只想将其复制css,,htmlinclude

.
..
123414
42344523
345343
2323
css
html
include

通常我的语法是这样的

rsync -avz /local/path/ user@server:/remote/path/ --exclude="cache"

我认为它应该看起来像这样 --exclude="[0-9]*",但我认为这不会起作用。

答案1

您不能在 rsync 的模式语法中说“仅包含数字的名称”。因此,请包含所有包含非数字的名称并排除其余名称。

rsync --include='*[!0-9]*' --exclude='*/' …

另请参阅我的rsync 模式指南

答案2

rsync 的排除选项并不真正支持正则表达式,它更多的是 shell 通配模式匹配。

如果这些目录相当静态,您应该将它们列在文件中并使用--exclude-from=/full/path/to/file/exclude_directories.txt.

更新以提供示例

首先,您只需将目录放入文件中:

find . -type d -regex '.*/[0-9]*$' -print > /tmp/rsync-dir-exlcusions.txt

或者

( cat <<EOT
123414
42344523
345343
2323
EOT ) > /tmp/rsync-directory-exclusions.txt

然后你就可以做你的 rsync 工作:

rsync -avHp --exclude-from=/tmp/rsync-directory-exclusions.txt /path/to/source/ /path/to/dest/

您只需要额外的步骤来设置包含要排除的目录的文本文件,每行 1 个。

请记住,作业中目录的路径是 rsync 如何查看目录的相对路径。

答案3

你可以用一行来完成:

rsync -avHp --exclude-from=<(cd /path/to/source; find . -type d -regex './[0-9]*' | sed -e 's|./||') /path/to/source/ /path/to/dest/

答案4

使用这个命令:

$> rsync -avlH --exclude=*.ibd --exclude-from=<(ls -p | grep -v / | \
   grep -E 'ibdata|ib_logfile')  /mnt/myfuse/ /u01/my3309/data/

相关内容