使用RSync复制连续范围的文件

时间:2014-09-08 13:49:02

标签: linux bash ubuntu rsync

很抱歉,如果这没有意义,但我会尝试提供所需的所有信息!

我想使用rsync将一系列顺序编号的文件从一个文件夹复制到另一个文件夹。

我正在存档DCDM(它是一部电影用品),它包含600,000个单独编号的连续.tif图像文件(~10mb ea。)。

我需要打破这一点才能正确存档到LTO6磁带上。我想使用rsync来准备文件夹,这样我的简单bash .sh文件就可以自动化我要备份到磁带的各种文件夹和文件。

运行rsync时通常使用的命令是:

sudo rsync -rvhW --progress --size only <src> <dest>

如果需要我使用sudo,我总是先用--dry-run

测试结果

我有任何工作的唯一方法(没有踢出错误)是使用*通配符。但是,这只有具有设置模式的文件(例如。01*只会移动010000 - 019999范围内的文件)而我必须重复020304等。

我已经在互联网上看了,我正在努力找到一个有效的答案。

这可能是不可能的,对于600,000个.tif文件,我不能为每个文件写一个排除项!

有关如何(如果有的话)可以做到的任何想法?

欧文。

4 个答案:

答案 0 :(得分:4)

您可以使用pattern matching

检查以数字开头的文件名
for file in [0-9]*; do
    # do something to $file name that starts with digit
done

或者,您可以启用extglob选项并循环覆盖仅包含数字的所有文件名。这可以消除任何以数字开头但在第一个字符后面包含非数字的潜在不需要的文件。

shopt -s extglob
for file in +([0-9]); do
    # do something to $file name that contains only digits
done
  • +([0-9])扩展为一个或多个数字

更新

根据您最近评论中的文件名模式:

shopt -s extglob
for file in legendary_dcdm_3d+([0-9]).tif; do
    # do something to $file
done

答案 1 :(得分:2)

Globing是shell的一项功能,可将通配符扩展为匹配的文件名列表。您已在问题中使用过它。

对于以下解释,我假设我们在一个包含以下文件的目录中:

$ ls -l
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 file.txt
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 funny_cat.jpg
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-1.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-2.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-3.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2013-4.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2014-1.pdf
-rw-r----- 1 5gon12eder staff 0 Sep  8 17:26 report_2014-2.pdf

最简单的情况是匹配所有文件。以下是一个穷人的ls

$ echo *
file.txt funny_cat.jpg report_2013-1.pdf report_2013-2.pdf report_2013-3.pdf report_2013-4.pdf report_2014-1.pdf report_2014-2.pdf

如果我们想要匹配2013年的所有报告,我们可以缩小匹配范围:

$ echo report_2013-*.pdf
report_2013-1.pdf report_2013-2.pdf report_2013-3.pdf report_2013-4.pdf

例如,我们可能遗漏了.pdf部分,但我希望尽可能具体。

您已经提出了一个解决方案,可以使用它来选择一系列编号的文件。例如,我们可以按季度匹配报告:

$ for q in 1 2 3 4; do echo "$q. quater: " report_*-$q.pdf; done
1. quater:  report_2013-1.pdf report_2014-1.pdf
2. quater:  report_2013-2.pdf report_2014-2.pdf
3. quater:  report_2013-3.pdf
4. quater:  report_2013-4.pdf

如果我们懒得输入1 2 3 4,我们可以使用$(seq 4)代替。这会使用参数seq调用程序4并替换其输出(在这种情况下为1 2 3 4)。

现在回到你的问题:如果你想要大小为10的块大小,你应该能够扩展上面的例子以满足你的需求。

答案 2 :(得分:0)

我知道这个老问题,但有人可能觉得这很有用。以上扩展范围的示例也适用于rsync。例如,从dir /tmp/from_here复制以a,b和c开头而不是d和e的文件到dir /tmp/to_here

$ rsync -avv /tmp/from_here/[a-c]* /tmp/to_here
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
alice/
bob/
cedric/
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 89 bytes  received 24 bytes  226.00 bytes/sec
total size is 0  speedup is 0.00

答案 3 :(得分:0)

如果您要写入LTO6磁带,则应考虑在命令中加入“--inplace”。 Inplace用于写入线性文件系统,如LTO