シェルコマンドでディレクトリ名の後のスラッシュ(/)

シェルコマンドでディレクトリ名の後のスラッシュ(/)

ここに小さな問題があります。

2つのファイルがあるfileafileb言うとmv filea fileb

  • 削除fileb
  • filea次に名前を変更するfileb

diraしたがって、2つのディレクトリがあり、dirbmv dira dirb

  • 引っ越す(なるでしょうdiradirbdirb/dira

どちらの場合も、通知やメッセージがないことを確認すると、これは非常に一貫性がないようです。私の考えでは、コンテンツで上書きするmv dira dirb必要があると思います(または名前付きディレクトリの下に2つのディレクトリをマージ)。dirbdiradirb

スラッシュのあるディレクトリ名(例dira/:)はディレクトリとして扱われ、スラッシュのない名前(例dira:)はファイルとして扱われるという内容(もちろんある程度)を読んだ記憶になります。とにかく、スラッシュを使ってシェル(zshとおそらくbash)が私のディレクトリ表記を尊重したいと思います。これを強制できる端末オプションはありますか?

明確にするために、これが私が望む動作です。

  • mv dira dirb結果dirbはコンテンツで上書きされます。dira
  • mv dira dirb/結果は(から)diraに移動されます。dirbdirb/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

全体的に一貫した動作を得るためのソリューションは次のとおりです(少なくともコマンドmvcp使用)。

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 DESTSOURCEcp-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'

関連情報