如何在不覆盖任何内容的情况下明确移动文件

如何在不覆盖任何内容的情况下明确移动文件

是否有命令或选项允许我移动文件而不覆盖任何内容?

为了便于讨论,我们将该文件命名为 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.barand :foo.bar

$ ./mv_safe.sh foo.bar feefoo

因此,在这里我们要“安全”地移动foo.barfeefoo,其中名称“ foo.bar”已被使用。让我们看看它给出了什么:

$ ls feefoo
foo.bar   foo.bar.1

是否有一个通常的mvif$1的名字还没有被使用$2

相关内容