la barre oblique (/) après un nom de répertoire sur les commandes shell

14

J'ai une petite question ici.

Si j'ai deux fichiers, par exemple fileaet fileb, mv filea filebserait

  • supprimer fileb
  • renommer fileaenfileb

Ensuite, si j'ai deux répertoires, disons diraet dirb, mv dira dirbserait

  • déplacer diradans dirb(il deviendra dirb/dira)

Notant que dans les deux cas, il n'y a pas d'avis ou de message, cela est assez incohérent pour moi. Je pense que mv dira dirbdevrait simplement écraser dirbavec le contenu de dira(ou fusionner les deux répertoires sous un répertoire nommé dirb).

Je me souviens avoir lu quelque part qu'un nom de répertoire avec une barre oblique (comme dira/) est traité comme un répertoire, et un nom sans barre oblique (comme dira) est traité comme un fichier (dans certaines limites, bien sûr). Quoi qu'il en soit, je veux maintenant que le shell (zsh et éventuellement bash) respecte ma notation d'un répertoire en utilisant une barre oblique. Y a-t-il une option de terminal qui me permet de faire respecter cela?

Pour clarifier, voici mon comportement souhaité:

  • mv dira dirbentraîne l’ dirbécrasement du contenu dedira
  • mv dira dirb/entraîne le diradéplacement vers dirb(en dirb/dira)

Quelqu'un a-t-il pensé la même chose que moi? Ou suis-je juste bizarre?

phunehehe
la source
2
Je pense que votre comportement souhaité serait plutôt dangereux.
starblue
@starblue: oui je suis d'accord pour dire que c'est dangereux, mais je préfère vivre avec quelque chose de dangereux, que d'incohérence
phunehehe

Réponses:

11

Oui, c'est un peu incohérent, même dans les outils GNU.

Un problème avec votre proposition est que les répertoires non vides ne peuvent pas être supprimés. En dehors de cela, -T(dans GNU land, de toute façon) se rapproche de ce que vous voulez (le premier cas):

$ 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
la source
Vous pouvez également ajouter un alias, par exemple alias ren=mv -T.
Mikel
0

Si vous voulez simplement tout déplacer de dira à dirb, vous pouvez exécuter mv dira/* dirb.

Selon la page de manuel mv sur mon HP-UX.

The mv command moves:

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

Hemant
la source
3
Votre commande manquerait tous les fichiers dot.
qbi
Qui a besoin de fichiers dot de toute façon;)
Robert Massaioli
1
Et si c'est un problème, shopt -s dotglobdans bash corrigera cela.
David Z