何も上書きせずに明示的にファイルを移動する方法

何も上書きせずに明示的にファイルを移動する方法

何も上書きせずにファイルを移動できるコマンドやオプションはありますか?

議論のために、このファイルの名前をfoo.rarとして指定します。

-n が機能し、ファイルを上書きしません。しかし、ファイルがあれば移動しません。システムエラー(例:ディスク容量不足)を除いてファイルを移動したいと思います。

-bも動作します。 -bの問題は、バックアップファイルがある場合、-bが新しいバックアップファイルでバックアップファイルを削除することです。

それでは、この質問にいくつかの文脈を追加するためのfoo.rarの例を見てみましょう。 /homeでfoo.rarを検索してみましょう。この名前の10の異なるファイルが見つかりました。私がしたいのは、次の3つのコマンドを実行することです。

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を使用できます。#>私は2つだけが欲しいです。ファイルの元の名前が何であるかを示し、ファイルの異なるバージョンが表示されます。

答え1

GNU mvを使っているのでできる適切な--backupオプションを使用してください。番号付きのバックアップをオンにします。

 mv --backup=numbered file1 file2 your_dir

-Sオプションでサフィックスを変更できます。

例は次のとおりです。

$ 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

警告:これはアトミックではありません。このスクリプトの複数のコピーを並列に実行して同じファイルをターゲットにしている場合は、互いのファイルを上書きできます。

feefoo/foo.bar例:/ tmpにandがあります。foo.bar

$ ./mv_safe.sh foo.bar feefoo

したがって、ここでは、「」という名前がすでに使用されている場所foo.barに「安全に」移動しようとします。それが何を提供しているか見てみましょう:feefoofoo.bar

$ ls feefoo
foo.bar   foo.bar.1

まだ使用されていない一般的なmvif名はありますか?$1$2

関連情報