如何安全地将文件批量移动到一个目录?

如何安全地将文件批量移动到一个目录?

如何将文件向上移动到目录中可能有数百或数千个文件的目录,并且您可能不确定...你会用什么方法?

如何处理欺骗会有所不同,有时我们会覆盖,有时我们需要更安全。 IO 可能很重要,因为这些是生产服务器。但给定数量时,不能选择提示非重复文件。保留权限和时间戳等很重要。我们通常不知道数据是什么。

哦,它mv不是必需的rsynccp欢迎使用解决方案。

注意:我们正在运行 CentOS 5.5,因此请告诉我它是否无法在该版本中工作,因为它是更新的...功能

答案1

我建议使用父级的 rsync:

rsync -avPr -b --suffix='-original' child/* .

这会将父级中的所有现有重复文件备份到文件-原来的。

答案2

cp -bal . ..

这会将当前目录中的所有内容复制到其上方的目录,保留所有权限,如果可能的话使用硬链接来最小化 IO,并在重复时创建文件名〜

在那之后

rm -rf . ; cd .. ; rmdir <originaldir>;

答案3

在此示例中,会将文件从“/parent/old-dir”移动到“/parent”:

cd /parent

rsync -av --progress old-dir/ .

rm -rf old-dir

根据 rsync 规则,它将用old-dir.

答案4

mv -i仅当目的地存在时才会提示。

yes n | mv -i …移动目标目录中不存在的所有文件。在 FreeBSD 和 OSX 上,您可以将其缩短为mv -n ….

请注意,这些都不会将目录参数与目标目录中同名的现有目录合并。


另一个问题是如何对当前目录中的所有文件进行操作。有两个问题:抓取所有文件(*省略点文件)并且不运行到命令行。在 Linux 上(或者更一般地使用 GNU find 和 GNU coreutils):

find . -mindepth 1 -maxdepth 1 -exec mv -i -t .. -- {} +

使用 GNU find 但不使用 GNU coreutils(或较旧的 GNU coreutils):

find . -mindepth 1 -maxdepth 1 -exec sh -c 'mv -i -- "$@" "$0"' .. {} +

便携:

find . -name . -o -exec sh -c 'mv -i -- "$@" "$0"' .. {} -type d -prune

像往常一样,zsh 让事情变得更容易。它内部没有命令行长度限制,因此如果您使用其mv内置命令,则无需担心这一点。您可以使用 glob 限定符告诉它不要忽略点文件D。限制:这不适用于跨文件系统(从 zsh 4.3.10 开始)。

zmodload zsh/files
mv -i -- *(D) ..

相关内容