der Schrägstrich (/) nach einem Verzeichnisnamen in Shell-Befehlen

14

Ich habe hier eine kleine Frage.

Wenn ich zwei Dateien habe, sagen Sie fileaund fileb, mv filea filebwürde

  • löschen fileb
  • umbenennen fileainfileb

Dann , wenn ich zwei Verzeichnisse haben, sagen diraund dirb, mv dira dirbwürde

  • bewege dich dirain dirb(es wird dirb/dira)

Wenn ich feststelle, dass es in beiden Fällen keine Benachrichtigung oder Nachricht gibt, ist dies für mich ziemlich inkonsistent. Ich denke, mv dira dirbsollte einfach dirbmit dem Inhalt von überschreiben dira(oder die beiden Verzeichnisse unter einem Verzeichnis namens zusammenführen dirb).

Ich erinnere mich, dass ich irgendwo gelesen habe, dass ein Verzeichnisname mit einem Schrägstrich (wie dira/) wie ein Verzeichnis behandelt wird und ein Name ohne Schrägstrich (wie dira) wie eine Datei behandelt wird (natürlich in gewissem Umfang). Wie auch immer, jetzt möchte ich die Shell (zsh und möglicherweise bash) dazu bringen, meine Notation eines Verzeichnisses mit einem Schrägstrich zu respektieren. Gibt es eine Terminaloption, mit der ich das durchsetzen kann?

Zur Verdeutlichung hier mein gewünschtes Verhalten:

  • mv dira dirbführt dazu, dirbdass der Inhalt von überschrieben wirddira
  • mv dira dirb/führt dazu, diradass in dirb(in dirb/dira) verschoben wird

Hat jemand so gedacht wie ich? Oder bin ich nur komisch?

Phunehehe
quelle
2
Ich denke, Ihr gewünschtes Verhalten wäre ziemlich gefährlich.
Starblue
@starblue: Ja, ich stimme zu, dass es gefährlich ist, aber ich würde lieber mit etwas Gefährlichem leben als mit Inkonsistenz
Phunehehe

Antworten:

11

Ja, dies ist selbst innerhalb der GNU-Tools etwas inkonsistent.

Ein Problem mit Ihrem Vorschlag ist, dass nicht leere Verzeichnisse nicht entfernt werden können. Abgesehen davon -Tnähert sich (jedenfalls im GNU-Land) ungefähr dem an, was Sie wollen (der erste Fall):

$ 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
Tshepang
quelle
Sie können auch einen Alias ​​hinzufügen, z alias ren=mv -T.
Mikel
0

Wenn Sie nur alles von Dira nach Dirb verschieben möchten, können Sie ausführen mv dira/* dirb.

Laut MV-Manpage auf meinem HP-UX.

The mv command moves:

+ One or more directory subtrees (directory1, [directory2, ...]) to a new or existing directory (dest-directory).

Hemant
quelle
3
Ihr Befehl würde alle Punktedateien verfehlen.
Qbi
Wer braucht schon
Punktedateien
1
Und wenn es ein Problem ist, wird dies shopt -s dotglobdurch Bash behoben.
David Z