Que s'est-il passé lorsque j'ai «mv *»? Aucune erreur n'a été affichée et il ne reste plus qu'un dossier. Pourquoi?

12

La commande exécutée était "mv space *" dans un dossier avec 14 Go de données.

mv *

du -hs 

est la même chose alors où sont passés les 14 Go de données? Qu'est-ce que j'ai fait?

user3032965
la source
Plus d'informations sont nécessaires. Quelle plateforme?
Jarmund
4
@Jarmund Je pense qu'il est prudent de supposer un certain * nix, étant donné que les deux commandes mentionnées sont des commandes communes sur les systèmes de type Unix. À cet égard, je pense qu'il est prudent de dire que la plupart des obus fonctionnent de la même manière. Nous pouvons donc en déduire suffisamment pour donner une réponse utile même si la plate-forme exacte n'est pas explicitement indiquée.
un CVn le
Un autre écueil à mentionner. Vous ne devez JAMAIS exécuter mvou cpavec " " sur des données non fiables. En effet, " " est développé et les fichiers avec des noms comme "--verbose" obtiennent des arguments de ligne de commande. Quoi utiliser à la place:cp ./* anotherFolder
VasyaNovikov

Réponses:

30

Je suppose que bash étend le caractère générique et déplace ainsi chaque dossier dans le dernier.

Par exemple:

$ ls
test1  test2  test3  test4

$ mv *

$ ls
test4

$ ls test4
test1  test2  test3

Ici, mv *est développé pour mv test1 test2 test3 test4correspondre au mv [OPTION]... SOURCE... DIRECTORYformat. Ainsi, chaque dossier est déplacé dans le dernier.

ssssteffff
la source
9
Cette. Par ailleurs, si vous souhaitez utiliser *dans un mv(ou cp), jetez un œil à leur --target-directorycommutateur. Cela garantit que vous ne serez pas mordu par des choses comme ça.
un CVn le
2

Comme décrit par @ssssteffff, avec mv *, le shell effectue une expansion générique à partir des fichiers du répertoire courant. Cependant, le comportement de la mvcommande dépend du nombre d'arguments *développés. S'il y a plus de deux arguments, le dernier argument doit être un répertoire:

   mv [OPTION]... SOURCE... DIRECTORY

Donc,

J'ai créé 5 fichiers

$ touch 1 2 3 4 5
$ ls
1  2  3  4  5
$ mv *
mv: target ‘5’ is not a directory
$ ls
1  2  3  4  5

Maintenant, si je crée un répertoire qui vient en dernier paramètre pour l'expansion des caractères génériques, alors:

$ mkdir 6
$ mv *
$ ls
6
$ ls 6
1  2  3  4  5

Vous devriez vérifier ce qu'était ce dernier argument.

  • Si le dernier argument était un répertoire, vos données sont peut-être en sécurité.
  • Si le nombre total d'arguments était de 2 et que le dernier argument était un répertoire, vos données sont peut-être également en sécurité.
  • Si le nombre total d'arguments était de 2 et que le dernier argument était un fichier, le deuxième fichier est définitivement parti.

Êtes-vous sûr que vous n'avez pas vu l'erreur quelque chose comme ça?

 mv: target ‘5’ is not a directory`
smoking
la source