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

Linux 使用RSync复制连续范围的文件,linux,bash,ubuntu,rsync,Linux,Bash,Ubuntu,Rsync,对不起,如果这没有意义,但我会尽力提供所有需要的信息 我想使用rsync将一系列按顺序编号的文件从一个文件夹复制到另一个文件夹 我正在存档一个DCDM(它是一个胶片),它包含600000个单独编号的顺序.tif图像文件(~10mb ea.) 我需要将其分解,以便正确地归档到LTO6磁带上。我想使用rsync来准备文件夹,这样我的简单bash.sh文件就可以自动处理我要备份到磁带上的各种文件夹和文件 我在运行rsync时通常使用的命令是: sudo rsync -rvhW --progress -

对不起,如果这没有意义,但我会尽力提供所有需要的信息

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

我正在存档一个DCDM(它是一个胶片),它包含600000个单独编号的顺序.tif图像文件(~10mb ea.)

我需要将其分解,以便正确地归档到LTO6磁带上。我想使用rsync来准备文件夹,这样我的简单bash.sh文件就可以自动处理我要备份到磁带上的各种文件夹和文件

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

sudo rsync -rvhW --progress --size only <src> <dest>
sudo rsync-rvhW——进度——仅限大小
如果需要,我会使用
sudo
,并且我总是先用
--dry run

我让任何东西工作(而不排除错误)的唯一方法是使用
*
通配符。但是,这仅适用于具有设置模式的文件(例如,
01*
只会移动范围
010000-019999
)并且我必须重复
02
03
04

我在互联网上搜索过,正在努力寻找一个有效的答案

这可能是不可能的,对于600000.tif文件,我无法为每个文件编写排除

关于如何(如果有的话)做到这一点,你有什么想法吗


Owen。

您可以使用以下方法检查以数字开头的文件名:

或者,您可以启用
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

全局化是shell的功能,它可以将通配符扩展为匹配文件名的列表。你已经在你的问题中使用了它

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

$ls-l
-rw-r-----1 5gon12eder staff 0 Sep 8 17:26 file.txt
-rw-r------1 5加拿大12 EDER工作人员9月8日17:26有趣的\u cat.jpg
-rw-r-----1 5gon12eder员工0 9月8日17:26报告\u 2013-1.pdf
-rw-r-----1 5gon12eder员工0 9月8日17:26报告\u 2013-2.pdf
-rw-r-----1 5gon12eder员工0 9月8日17:26报告\u 2013-3.pdf
-rw-r-----1 5gon12eder员工0 9月8日17:26报告\u 2013-4.pdf
-rw-r-----1 5gon12eder员工0 9月8日17:26报告_2014-1.pdf
-rw-r-----1 5gon12eder员工0 9月8日17:26报告_2014-2.pdf
最简单的情况是匹配所有文件。以下是穷人的
ls

$echo*
file.txt funcy_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\u 2013-*.pdf
report_2013-1.pdf report_2013-2.pdf report_2013-3.pdf report_2013-4.pdf
例如,我们可以省略
.pdf
部分,但我希望尽可能具体

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

$1 2 3 4中的q;do echo“$q.quater:”报告*-$q.pdf;完成
1。第四季度:报告\u 2013-1.pdf报告\u 2014-1.pdf
2.第四季度:报告\u 2013-2.pdf报告\u 2014-2.pdf
3.第四季度:2013-3.pdf报告
4.第四季度:2013-4.pdf报告
如果我们懒得输入
1234
,我们可以使用
$(seq 4)
。这将使用参数
4
调用程序
seq
,并替换其输出(
1234


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

我知道这个老问题,但是有人可能会发现这个有用。上述扩展范围的示例也适用于
rsync
。例如,要将以a、b和c开头但不是以d和e开头的文件从dir
/tmp/from_here
复制到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

如果你写的是Lto6磁带,你应该考虑在你的命令中包括“-in到位”。Inplace用于写入线性文件系统,如LTO

您需要启用extglob选项,了解这一点很有用!!!不过,感谢您,当我回复一条评论时,文件的格式是:legendary_dcdm_3dXXXXXX.tif那么您如何调整此格式以适应文本开头的事实?@OwenMorgan我已更新帖子以匹配您评论中提供的格式的文件名。@JohnB我很困惑。。。。。。。。我使用了您编写的代码,添加了
rsync-rvhW--progress--size-only$file/000000-050000_test
并且没有移动tif。。。。。我使用了以下范围
010000-050000
(文件名中出现前导0。您可以使用最简单的全局表达式匹配所有文件。
*
。如果匹配的文件太多,您需要告诉我们要排除哪些其他模式,以便我们帮助您缩小匹配范围。@5gon12eder好的,我对Linux不太熟悉,所以不确定全局表达式是什么……就文件而言,它们是按照惯例重新命名为“legendary_dcdm_3dXXXXXX.tif”(其中X是一个数字)…我想将20-50K文件移动到单独的文件中,这样a)可以将文件夹的大小拆分为适合LTO6磁带的大小,b)可以在需要时更轻松地进行恢复…问题是,当我想要一个范围时会发生什么?使用您的示例:当文件包含600000个报告\u 2013文件时,我想列出报告\u 2013-2和报告\u 2013-3。。。。将其扩展到50000个文件范围,从600000个
legendary\u dcdm\u 3d45*。tif
将扩展到
legendary\u dcdm\u 3d450000.t
$ 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