名前構造がすべて同じ数百のフォルダがあります。 ##*、00内のすべてのフォルダをバックアップするにはrsyncを使用する必要があります。あるドライブの範囲は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
(glob修飾子はディレクトリタイプのファイルのみを選択し、サポートされていませbash
んksh
。)(/)
POSIX的に:
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 {} +