我有几百个文件夹,所有文件夹都具有相同的名称结构,##* ,我需要用rsync备份00以内的所有文件夹一个驱动器的范围为 15_ ,另一个驱动器的范围为 16_ 到 99_ 。如何过滤每个列表以将其传递给 rsync?
drwxrwxrwx+ 10 user user 4096 Feb 16 2017 07_MrSmith
drwxrwxrwx+ 3 user user 4096 Mar 24 12:55 10_Other_File
drwxrwxrwx+ 4 user user 4096 Aug 23 14:33 15_New_Interesting_folder
drwxrwxrwx+ 9 user user 4096 Aug 31 17:23 16_SimpleFolderNaming
drwxrwxrwx+ 3 user user 4096 May 8 12:53 17_VeryCurious
drwxrwxrwx+ 6 user user 4096 Mar 28 12:38 17_MantinanVinil
drwxrwxrwx+ 3 user user 4096 Mar 28 11:47 17_AnotherFolderWith_Subfolders
我尝试寻找“find”、“xargs”或“rsync”命令的参数,这些参数允许将子集与数字进行比较,但我找不到解决方案。
当我做:
find -maxdepth 1 -regextype posix-extended -regex '..[0-1][0-5]_*'
过滤 00-15 范围内的文件夹不会返回任何内容。
答案1
和zsh
:
rsync ... <0-15>_*(/) somewhere
rsync ... <16->_*(/) somewhere-else
与ksh
或bash -O extglob
或zsh -o kshglob
:
rsync ... @(0[0-9]|1[0-5])_* somewhere
rsync ... @(1[6-9]|[2-9][0-9])_* somewhere-else
或者您可以在单独的 glob 中执行此操作(尽管如果任何一个 glob 与任何文件都不匹配,您会看到错误消息rsync
,并且您最终可能会同步名为字面意思的文件0[0-9]_*
,1[0-5]_*
...):
rsync ... 0[0-9]_* 1[0-5]_* somewhere
rsync ... 1[6-9]_* [2-9][0-9]_* somewhere-else
(请注意,bash
并且ksh
不支持(/)
glob 限定符仅选择目录类型的文件)。
POSIXly:
find . ! -name . -prune \( -name '0[0-9]_*' -o -name '1[0-5]_*' \) \
-type d -exec sh -c 'exec rsync ... "$@" somewhere' sh {} +
find . ! -name . -prune \( -name '1[6-9]_*' -o -name '[2-9][0-9]_*' \) \
-type d -exec sh -c 'exec rsync ... "$@" somewhere-else' sh {} +