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 mvlinea è che la shell si espande *.txtnei file corrispondenti. Poiché non ci sono *.tsvfile che non sono stati modificati.
Il mvcomando 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 mvprogramma 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 mvcomando viene eseguito con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Ora, di nuovo, mvcontrolla per vedere se *.tsvesiste. In caso contrario, il file file1.txtviene spostato in *.tsv. Cioè: il file viene rinominato *.tsvcon 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 mvcomando viene eseguito con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Poiché *.tsvora è una directory, i file finiscono per essere spostati lì.
Ora: usando comandi come some_command *.tsvquando 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 mvcomando 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_DIRopzione, 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 mvsarebbe 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 mvnon è menzionato affatto, ma rename. Se hai più link che potresti condividere. Così come per le pagine man in cui si afferma che questo è espresso.