ここに小さな問題があります。
2つのファイルがあるfilea
とfileb
言うとmv filea fileb
- 削除
fileb
filea
次に名前を変更するfileb
dira
したがって、2つのディレクトリがあり、dirb
mv dira dirb
- 引っ越す(なるでしょう
dira
)dirb
dirb/dira
どちらの場合も、通知やメッセージがないことを確認すると、これは非常に一貫性がないようです。私の考えでは、コンテンツで上書きするmv dira dirb
必要があると思います(または名前付きディレクトリの下に2つのディレクトリをマージ)。dirb
dira
dirb
スラッシュのあるディレクトリ名(例dira/
:)はディレクトリとして扱われ、スラッシュのない名前(例dira
:)はファイルとして扱われるという内容(もちろんある程度)を読んだ記憶になります。とにかく、スラッシュを使ってシェル(zshとおそらくbash)が私のディレクトリ表記を尊重したいと思います。これを強制できる端末オプションはありますか?
明確にするために、これが私が望む動作です。
mv dira dirb
結果dirb
はコンテンツで上書きされます。dira
mv dira dirb/
結果は(から)dira
に移動されます。dirb
dirb/dira
私と同じ考えを持つ人はいますか?それとも私だけ変なのかな?
答え1
はい、これはGNUツール間でわずかに一貫性がありません。
提案の 1 つの問題は、空でないディレクトリを削除できないことです。それ以外は-T
(GNU領域ではとにかく)おおよそのものです(最初の場合)。
$ ls dira/ dirb/
dira/:
a
dirb/:
b
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
mv: cannot move `dira/' to `dirb/': Directory not empty
$ rm dirb/b
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
$ ls dira/ dirb/
ls: cannot access dira/: No such file or directory
dirb/:
a
答え2
diraからdirbにすべてを移動するには、次を実行できますmv dira/* dirb
。
私のHP-UXのmvのマニュアルページによると。
The mv command moves:
+ One or more directory subtrees (directory1, [directory2, ...]) to a new or existing directory (dest-directory).
答え3
全体的に一貫した動作を得るためのソリューションは次のとおりです(少なくともコマンドmv
をcp
使用)。
move( mv
) コマンドの場合
次のオプションを使用すると、より一貫した動作を得ることができます-i
。
mv -i SOURCE DEST
filea
これは、すでに存在するデータを上書きするときに警告を表示し、確認を要求しますが、fileb
他の場合はそうではありません。つまり、データが失われた場合にのみ警告と確認メッセージが表示されます。
$ mv -i filea fileb
:
fileb
まだ存在しない場合、filea
自動的に名前が次に変更されました。fileb
fileb
すでに存在する場合fileb
、上書きする前に確認が必要filea
$ mv -i dira dirb
:
dirb
まだ存在しない場合、dira
自動的に名前が次に変更されました。dirb
dirb
すでに存在する場合、dira
静かに引っ越したdirb
永久的な解決策は、エイリアスを作成することです。$ alias mv='mv -i'
コピー(cp
)コマンドの場合
このcp
コマンドにも-i
同様のオプションがあります。ただし、このオプションを指定しないと、すべてのディレクトリが無視されるため、ディレクトリと同じようにはcp SOURCE DEST
動作しません。mv -i SOURCE DEST
SOURCE
cp
-r
したがって、同様の動作を得るには、mv -i
次のコマンドを使用できます。
$ cp -ir SOURCE DEST
mv -i
これは、コマンドに示されているように、同様の方法でファイルとディレクトリを処理し、上書きする前に警告を表示して確認を要求します。
$ cp -ir filea fileb
:
fileb
まだ存在しない場合、filea
自動的にコピーされます。fileb
fileb
すでに存在する場合fileb
、コピーで上書きする前に確認が必要です。filea
$ cp -ir dira dirb
:
dirb
まだ存在しない場合、dira
自動的にコピーされます。dirb
dirb
すでに存在する場合、dira
自動的にコピーされます。dirb
ここで永続的な解決策は、エイリアスを作成することです。$ alias cp='cp -ir'