mv:ターゲットが存在しない場合にのみファイルを移動する

mv:ターゲットが存在しない場合にのみファイルを移動する

存在しない場合にのみ移動する方法で使用できますかmv file1 file2file1file2file2

頑張った

yes n | mv -i file1 file2

(これはmvfile2を上書きする必要があるかどうかを尋ね、自動的に「いいえ」と答えます)-i。これは別の値です)

答え1

mv -vn file1 file2。このコマンドは必要に応じて機能します。-v必要に応じてスキップできます。

-v冗長にしてください - mvはファイルを移動したかどうかを教えてくれます(ファイルが移動されない可能性があるため便利です)

-nfile2が存在しない場合にのみ移動します。

しかし、参考にしてください。これはPOSIXではありません〜のようにトーマス・ディッキーが言及した

答え2

mv -n

man mvGNUシステムから:

-n, --no-clobber
既存のファイルを上書きしません。

FreeBSDシステムの場合:

-n既存のファイルを上書きしないでください。 (-n オプションは、以前の -f または -i オプションよりも優先されます。)

答え3

if [ ! -e file2 ] && [ ! -L file2 ]
then
    mv file1 file2
# else echo >&2 there is already a file2 file.
fi

または:

if ! ls -d file2 > /dev/null 2>&1
then
    mv file1 file2
fi

mvfile2存在しない場合にのみ実行してください。 aがテストとの間に作成された可能性があるため、aが上書きfile2されないという保証はありません。ただし、少なくとも最新バージョンのGNUはその保証を提供していません(たとえ検査が行われるため、競合条件はより狭くなりますが)。 )以内に完了しました。file2mvmv-i-nmv

一方、移植性に優れているため、ファイルタイプfile2(一般、パイプ、ファイル形式)に関係なく、さまざまなケースを区別できます。目次)。

答え4

test -e name名前が存在する場合(ファイル、ディレクトリ、またはシンボリックリンクに関係なく)trueを返すwhichを使用することもできます。

たとえば、

touch file
mkdir dir
ln -s file symlink
test -e file && echo file exists
test -e dir && echo dir exists
test -e symlink && echo symlink exists
test -e file || echo you wont see this echo
test -e doesnotexist || echo doesnotexist does not exist...

関連情報