web-dev-qa-db-ja.com

mv:宛先が存在しない場合にのみファイルを移動します

使ってもいいですか mv file1 file2移動するだけの方法でfile1file2の場合file2存在しませんか?

私はもう試した

yes n | mv -i file1 file2

(これにより、mvはfile2をオーバーライドする必要があるかどうかを尋ね、自動的に「いいえ」と答えます)しかし、不正使用以外に-iまた、素敵なエラーコードも表示されません(移動した場合は常に0ではなく、常に141、移動しなかった場合は何か)。

51

mv -vn file1 file2。このコマンドはあなたが望むことをします。スキップできます-v お望みならば。

-v冗長にします-ファイルを移動すると、mvはファイルを移動したことを通知します(ファイルが移動されない可能性があるため便利です)

-nは、file2が存在しない場合にのみ移動します。

ただし、 これはPOSIXではありませんThomasDickeyで言及 であることに注意してください。

71
MatthewRock

mv -n

GNUシステム上のman mvから:

-n、-no-clobber
既存のファイルを上書きしない

FreeBSDシステムの場合:

-n既存のファイルを上書きしません。 (-nオプションは、以前の-fまたは-iオプションをオーバーライドします。)

17
Dani_l
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

file2が存在しない場合にのみmvを実行します。テストとmvの間にfile2が作成された可能性があるため、file2がオーバーライドされないことは保証されませんが、少なくとも現在のバージョンの= GNU mv with -iまたは-nは、どちらの保証も与えません(ただし、チェックはmv)。

一方、移植性があり、大文字と小文字を区別でき、file2ファイルのタイプ(通常、パイプ、さらにはディレクトリ)に関係なく機能します。

10
Majenko

GNU lnを使用したレースフリーのアプローチは、file1がタイプdirectoryでない場合に提供されます:

ln -PT file1 file2 && rm file1

(一部のネットワークファイルシステムのバグを除いて)、_link()システムコールにより、file2ファイルが上書きされないことが保証されます(または、file2がディレクトリタイプである場合、file1はそこに移動されません)。 、ターゲットが存在する場合、rename()システムコールとは逆に失敗します。

ただし、ファイルがfile1file2の両方として存在する中間状態になります。

-Tオプション(file2がディレクトリ型であっても常にlink("file1", "file2")を実行するため)はGNU固有です。

linkコマンドを使用することもできます。

link file1 file2 && rm file1

ただし、file1がシンボリックリンクの場合、実装に応じて、file2はそのシンボリックリンクまたはそのシンボリックリンクのターゲットへのハードリンクになります(Solarisでは、/usr/sbin/linkではなく/usr/xpg4/bin/linkを使用します)。

8

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

例えば:

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...
0
H Briceno