复制指定范围内文件大小的文件和目录树

复制指定范围内文件大小的文件和目录树

我想制作一个小脚本,将文件从不同的目录示例/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/...

-ato 标志表示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 “保留模式”(权限、所有权)

相关内容