Lorsque vous exécutez la commande:
mv *.txt *.tsv
le shell, supposons bash, développe les caractères génériques s'il y a des fichiers correspondants (y compris des répertoires). La liste des fichiers est passée au programme, ici mv
. Si aucune correspondance n'est trouvée, la version non étendue est transmise.
Encore une fois: le shell étend les motifs, pas le programme.
Beaucoup d'exemples est peut-être le meilleur moyen, alors c'est parti:
Exemple 1:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Maintenant, ce qui se passe sur la mv
ligne, c'est que le shell se développe *.txt
dans les fichiers correspondants. Comme il n'y a aucun *.tsv
fichier qui n'est pas modifié.
La mv
commande est appelée avec deux arguments spéciaux :
argc
: Nombre d'arguments, y compris le programme.
argv
: Un tableau d'arguments, y compris le programme comme première entrée.
Dans l'exemple ci-dessus, ce serait:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
Le mv
programme vérifie si le dernier argument,, *.tsv
est un répertoire. Comme il ne l'est pas, le programme ne peut pas continuer car il n'est pas conçu pour concaténer des fichiers. (Déplacez généralement tous les fichiers en un seul.) Ni créez de répertoires sur un coup de tête.
En conséquence, il abandonne et signale l'erreur:
mv: target ‘*.tsv’ is not a directory
Exemple 2:
Maintenant, si vous dites à la place:
$ mv *1.txt *.tsv
La mv
commande est exécutée avec:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Maintenant, encore une fois, mv
vérifiez s'il *.tsv
existe. Comme ce n'est pas le cas, le fichier file1.txt
est déplacé vers *.tsv
. C'est-à-dire: le fichier est renommé *.tsv
avec l'astérisque et tout.
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
Exemple 3:
Si vous avez plutôt dit:
$ mkdir *.tsv
$ mv *.txt *.tsv
La mv
commande est exécutée avec:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Comme c'est *.tsv
maintenant un répertoire, les fichiers finissent par y être déplacés.
Maintenant: en utilisant des commandes comme some_command *.tsv
lorsque l'intention est de conserver le caractère générique, il faut toujours le citer. En citant, vous empêchez les caractères génériques d'être étendus s'il doit y avoir des correspondances. Par exemple, dites mkdir "*.tsv"
.
Exemple 4:
L'extension peut encore être visualisée si vous faites par exemple:
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
Exemple 5:
Maintenant: la mv
commande peut fonctionner et fonctionne sur plusieurs fichiers. Mais s'il y en a plus de deux, le dernier doit être un répertoire cible. (En option, vous pouvez utiliser l' -t TARGET_DIR
option, au moins pour GNU mv.)
Donc ça va:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
Ici mv
serait appelé avec:
argc = 7
argv[0] = mv
argv[1] = b1.tsv
argv[2] = b2.tsv
argv[3] = f1.txt
argv[4] = f2.txt
argv[5] = f3.txt
argv[6] = foo
et tous les fichiers se retrouvent dans le répertoire foo
.
Quant à vos liens. Vous en avez fourni un (dans un commentaire), où il mv
n'est pas du tout mentionné, mais rename
. Si vous avez plus de liens que vous pourriez partager. Ainsi que pour les pages de manuel où vous affirmez que cela est exprimé.