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


10

如何将文件上移到目录中,其中目录中可能有成百上千个文件,并且您可能不确定其中是否存在重复项..。您将使用哪种方法?

处理欺骗的方式会有所不同,有时我们会覆盖,有时我们需要更安全。IO可能很重要,因为它们是生产服务器。但是给定数量时,提示您输入不重复的文件是不可行的。保留权限和时间戳等很重要。我们通常不知道数据是什么。

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

注意:我们正在运行CentOS 5.5,所以请告知它是否由于最新功能而不能在那里工作。


ypu想对骗子做什么?

@Iain取决于情况?我在网络主机上工作……这实际上取决于…… mv以及我们是否关心……的情况,以及我们是否已经进行了备份。这个问题是相当开放的。我只是在寻找好的选择,也许是关于它是否会咬你以及如何咬人的评论。
xenoterracide 2010年

我认为有太多的文件shell来处理mv * ../mv -i * ../
Michael Mrozek

@Michael我确定它会有所不同...在某些情况下可能不会。在某些情况下。我正在尝试为我的工作环境争取尽可能多的选择。
xenoterracide 2010年

Answers:


6

我建议从父级使用rsync:

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

这会将父目录中所有现有的重复文件备份到文件原始文件


我认为-a暗示-r
xenoterracide 2010年

@xenoterracide-对,'r'–
Tok

@Tok是否可以将副本作为硬链接?以免浪费IO。(如-lcp
xenoterracide

@xenoterracide-您可以对rsync 使用-H--hard-links标志来保留硬链接。
Tok

1
@xenoterracide-您可以使用该--link-dest=DIR标志来实现此行为,如下所示:rsync -avP --link-dest=/path/to/src /path/to/src/* /path/to/dest/这将硬链接到dst / src和src之间的所有未更改文件,在此情况下为所有文件。通常,当您希望重新链接备份文件而不复制其数据(例如)时,会看到此标志--link-dest=/most/recent/backup
Tok

4
cp -bal . ..

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

之后

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

可能确实会遇到大量文件问题...但是不像rsync那样占用大量IO。
xenoterracide 2010年


1

你可以试试

find . -maxdepth 1 -print0 | xargs -I '{}' -r0 mv '{}' ..

这将覆盖..中的重复文件

如果..中的重复项相同或更新,则可以使用mv -u'{}'不覆盖


为什么用管道找到xargs?为什么不使用+
xenoterracide 2010年

1
@xenoterracide-习惯和可移植性(它是GNU扩展)。最重要的是,我已经尝试过了,无法弄清楚如何将第二个参数传递..mv '{}' +命令,因为+只是添加到末尾。

@Iain + 在POSIX中,实际上我以前曾被告知GNU find迟到了。
xenoterracide 2010年

您是对的,但我仍然想不出一种使用..

2
@xenoterracide:随着GNU的coreutils: -exec mv -t .. -- {} +。便携式:-exec sh -c 'mv -- "$@"' _ {} +
吉尔斯(Gillles)“所以-别再邪恶了”

1

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查找但不查找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内置命令,则无需担心。而且您可以告诉它不要使用Dglob限定符忽略点文件。限制:这不适用于文件系统(从zsh 4.3.10开始)。

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

有很多争论吗?
xenoterracide 2010年

0

我说过我们的机器学习

mv * ..

显然,这不是很安全...它将覆盖所有内容。它可能有我从未遇到过的限制。


2
如果您有大量文件,则可能会收到“参数列表过长错误”。

2
如果文件名以开头,则可能会造成不良后果-。它不会捕获名称以开头的文件.
吉尔(Gilles)'所以

0

以下是我过去使用过的效果很好的python模板。

#!/usr/bin/env python
#
# Bart Kastermans, www.bartk.nl
#
# rename of collection of files in a directory
import os
import shutil

# only work on files whose name starts with a D
files = [filename for filename in os.listdir ("/Users/kasterma/Music/Audio Hijack/") if filename[0] =="D"]

for filename in files:
    shutil.move (filename, filename [:23] + ".mp3")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.