Quando si emette il comando:
mv *.txt *.tsv
la shell, supponiamo bash, espande i caratteri jolly se ci sono file corrispondenti (comprese le directory). L'elenco dei file viene passato al programma, qui mv
. Se non viene trovata alcuna corrispondenza, viene passata la versione non espansa.
Ancora: la shell espande gli schemi, non il programma.
Un sacco di esempi è forse il modo migliore, quindi eccoci qui:
Esempio 1:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Ora ciò che accade sulla mv
linea è che la shell si espande *.txt
nei file corrispondenti. Poiché non ci sono *.tsv
file che non sono stati modificati.
Il mv
comando viene chiamato con due argomenti speciali :
argc
: Numero di argomenti, incluso il programma.
argv
: Una serie di argomenti, incluso il programma come prima voce.
Nell'esempio sopra che sarebbe:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
Il mv
programma controlla se l'ultimo argomento *.tsv
è una directory. Altrimenti, il programma non può continuare in quanto non è progettato per concatenare i file. (In genere sposta tutti i file in uno.) Né crea directory per un capriccio.
Di conseguenza si interrompe e segnala l'errore:
mv: target ‘*.tsv’ is not a directory
Esempio 2:
Ora se invece dici:
$ mv *1.txt *.tsv
Il mv
comando viene eseguito con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Ora, di nuovo, mv
controlla per vedere se *.tsv
esiste. In caso contrario, il file file1.txt
viene spostato in *.tsv
. Cioè: il file viene rinominato *.tsv
con l'asterisco e tutti.
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
Esempio 3:
Se invece hai detto:
$ mkdir *.tsv
$ mv *.txt *.tsv
Il mv
comando viene eseguito con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Poiché *.tsv
ora è una directory, i file finiscono per essere spostati lì.
Ora: usando comandi come some_command *.tsv
quando l'intenzione è quella di mantenere il carattere jolly si dovrebbe sempre citarlo. Citando, impedisci l'espansione dei caratteri jolly in caso di corrispondenze. Ad esempio dire mkdir "*.tsv"
.
Esempio 4:
L'espansione può essere ulteriormente visualizzata se lo fai ad esempio:
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
Esempio 5:
Ora: il mv
comando può e funziona su più file. Ma se ce ne sono più di due, l'ultimo deve essere una directory di destinazione. (Opzionalmente puoi usare l' -t TARGET_DIR
opzione, almeno per GNU mv.)
Quindi va bene:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
Qui mv
sarebbe chiamato con:
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
e tutti i file finiscono nella directory foo
.
Per quanto riguarda i tuoi link. Ne hai fornito uno (in un commento), dove mv
non è menzionato affatto, ma rename
. Se hai più link che potresti condividere. Così come per le pagine man in cui si afferma che questo è espresso.