是否有命令或选项允许我移动文件而不覆盖任何内容?
为了便于讨论,我们将该文件命名为 foo.rar。
现在 -n 起作用了,它不会覆盖文件。但如果文件存在,它也不会移动该文件。我希望文件被移动,除了系统错误(例如磁盘空间的 otu)。
-b 也可以。 -b 的问题是,如果有备份文件,那么 -b 会用新的备份文件破坏备份文件。
现在,为了给这个问题补充一点内容,让我们看一下 foo.rar 的示例。让我们在 /home 中搜索 foo.rar。我们找到 10 个具有该名称的不同文件。我想做的是执行以下三个命令。
mkdir /tmp/foo_files
find /home -iname "foo.rar" -exec wanted_mv_command {} /tmp/foo_files \;
mv /tmp/foo_files ~/
我希望 ~/foo_files 包含以下内容: foo.rar, foo.rar.1, foo.rar.2 ... foo.rar.9 。
我不在乎使用什么模式。例如,它可以使用 foo.#.rar 而不是 foo.rar.# > 我只是想要两件事。它指示文件的原始名称是什么,并且显示文件的不同版本。
答案1
既然你使用的是 GNU mv,你能使用它的--backup
选项。只需打开编号备份即可。
mv --backup=numbered file1 file2 your_dir
您可以通过-S
选项更改 de 后缀。
这是一个例子:
$ mv --backup=numbered aa/foo bb/foo cc/foo .
$ ls
aa bb cc foo foo.~1~ foo.~2~
答案2
我刚刚做了一个小脚本,我们称之为mv_safe.sh
。用法:mv_safe SOURCE_FILE TARGET_DIRECTORY
if test ! -e "$2/$1"
then
mv -- "$1" "$2"
else
tries=1
while test -e "$2/$1.$tries"
do
tries=$((tries+1))
done
mv -T -- "$1" "$2/$1.$tries"
fi
警告:这不是原子的。如果您并行运行此脚本的多个副本,并且它们恰好针对同一文件,则它们可能会覆盖彼此的文件。
示例:您的 /tmp 中有feefoo/foo.bar
and :foo.bar
$ ./mv_safe.sh foo.bar feefoo
因此,在这里我们要“安全”地移动foo.bar
到feefoo
,其中名称“ foo.bar
”已被使用。让我们看看它给出了什么:
$ ls feefoo
foo.bar foo.bar.1
是否有一个通常的mv
if$1
的名字还没有被使用$2