我想制作一个小脚本,将文件从不同的目录示例/pp/01
/pp/02/
等复制到具有相同目录设计的另一个目的地。但仅限于目录中大小大于 88MB 但小于 93MB 的文件...
我会使用 for 循环和 find 函数。有没有更有效的方法?以及如何准确地实现查找功能。
答案1
这个命令:
rsync -a --min-size 88m --max-size 93m pp /new_destination/
将结构从 复制pp
到/new_destination
,但仅复制大小至少为 88 MB 且最多为 93 MB 的文件。
如果您愿意,可以在最终目标说明符之前添加更多源目录树,例如:
rsync -a --min-size 88m --max-size 93m pp/01 pp/02 /target/
如果您在源规范中添加尾部斜杠(pp/
而不是pp
),rsync
则不会在目标中创建该目录。
换句话说:pp
在我的第一个示例中,结果为/new_destination/pp/01/...
,而:
rsync -a --min-size 88m --max-size 93m pp/ /new_destination/
相反,结果是/new_destination/01/...
, /new_destination/02/...
。
-a
to 标志表示rsync
“归档”,它递归目录,保留文件上的元数据,例如权限和时间戳。 (这是一个方便的选项,相当于-rlptgoD
一个非常流行的选项组合)。
答案2
我想这就是您正在寻找的:
$ find /file/location/ -type f -size +88M -size -93M \
-exec cp {} /new/location/ \;`
此命令将仅查找大于 88MB 且小于 93MB 的文件。然后它会将每个文件复制到/new/location
.
当涉及到保持目录结构时,就变得有点困难了。我会这样解决这个问题:
$ cd /pp
$ find . -type f -size +88M -size -93M -exec cp \
--parents {} /new/location/pp \;
这将使find
返回的文件路径看起来像01/myfile
,02/myfile
等等。父标志 oncp
使其附加斜线 + 源文件的指定名称。
示例:find
查找匹配的文件并输出“02/myfile”。cp
将此文件移动到/new/location/pp/02/myfile
,创建所需的任何目录。
答案3
假设文件和目录名称不包含换行符,POSIXly:
cd /path/to/src/ &&
find . -type f -size -"$((93 * 1024 * 1024))c" \
-size +"$((88 * 1024 * 1024))c" |
pax -rw /path/to/dst/
答案4
要复制大小在“最小”到“最大”范围内的文件,并重新创建目录结构,请使用类似以下内容
MINSIZE=3k
MAXSIZE=10k
cd /source/dir && \
find . -type f -size "+$MINSIZE" -size "-$MAXSIZE" | cpio -pvdm /target/path
cpio
选项
-p
“传递”模式,将列出的每个文件复制到指定目录-v
“详细”,可以省略,或者为每个文件打一个点,只是为了获得有关进度的视觉线索,请-V
改为使用。-d
“根据需要创建目录”-m
“保留模式”(权限、所有权)