使ってもいいですか mv file1 file2
移動するだけの方法でfile1
〜file2
の場合file2
存在しませんか?
私はもう試した
yes n | mv -i file1 file2
(これにより、mv
はfile2をオーバーライドする必要があるかどうかを尋ね、自動的に「いいえ」と答えます)しかし、不正使用以外に-i
また、素敵なエラーコードも表示されません(移動した場合は常に0ではなく、常に141、移動しなかった場合は何か)。
mv -vn file1 file2
。このコマンドはあなたが望むことをします。スキップできます-v
お望みならば。
-v
冗長にします-ファイルを移動すると、mvはファイルを移動したことを通知します(ファイルが移動されない可能性があるため便利です)
-n
は、file2が存在しない場合にのみ移動します。
ただし、 これはPOSIXではありませんThomasDickeyで言及 であることに注意してください。
mv -n
GNUシステム上のman mv
から:
-n、-no-clobber
既存のファイルを上書きしない
FreeBSDシステムの場合:
-n
既存のファイルを上書きしません。 (-nオプションは、以前の-fまたは-iオプションをオーバーライドします。)
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
ファイルのタイプ(通常、パイプ、さらにはディレクトリ)に関係なく機能します。
GNU ln
を使用したレースフリーのアプローチは、file1
がタイプdirectoryでない場合に提供されます:
ln -PT file1 file2 && rm file1
(一部のネットワークファイルシステムのバグを除いて)、_link()
システムコールにより、file2
ファイルが上書きされないことが保証されます(または、file2
がディレクトリタイプである場合、file1
はそこに移動されません)。 、ターゲットが存在する場合、rename()
システムコールとは逆に失敗します。
ただし、ファイルがfile1
とfile2
の両方として存在する中間状態になります。
-T
オプション(file2
がディレクトリ型であっても常にlink("file1", "file2")
を実行するため)はGNU固有です。
link
コマンドを使用することもできます。
link file1 file2 && rm file1
ただし、file1
がシンボリックリンクの場合、実装に応じて、file2
はそのシンボリックリンクまたはそのシンボリックリンクのターゲットへのハードリンクになります(Solarisでは、/usr/sbin/link
ではなく/usr/xpg4/bin/link
を使用します)。
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...