如何将文件向上移动到目录中可能有数百或数千个文件的目录,并且您可能不确定..
.你会用什么方法?
如何处理欺骗会有所不同,有时我们会覆盖,有时我们需要更安全。 IO 可能很重要,因为这些是生产服务器。但给定数量时,不能选择提示非重复文件。保留权限和时间戳等很重要。我们通常不知道数据是什么。
哦,它mv
不是必需的rsync
,cp
欢迎使用解决方案。
注意:我们正在运行 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) ..