Cuando emite el comando:
mv *.txt *.tsv
el shell, supongamos que bash, expande los comodines si hay archivos coincidentes (incluidos los directorios). La lista de archivos se pasa al programa, aquí mv. Si no se encuentran coincidencias, se pasa la versión no expandida.
Nuevamente: el shell expande los patrones, no el programa.
Un montón de ejemplos es quizás la mejor manera, así que aquí vamos:
Ejemplo 1:
$ ls
file1.txt file2.txt
$ mv *.txt *.tsv
Ahora lo que sucede en la mvlínea es que el shell se expande *.txta los archivos coincidentes. Como no hay *.tsvarchivos que no se modifiquen.
El mvcomando se llama con dos argumentos especiales :
argc: Número de argumentos, incluido el programa.
argv: Una matriz de argumentos, incluido el programa como primera entrada.
En el ejemplo anterior sería:
argc = 4
argv[0] = mv
argv[1] = file1.txt
argv[2] = file2.txt
argv[3] = *.tsv
El mvprograma verifica si el último argumento *.tsv, es un directorio. Como no es así, el programa no puede continuar ya que no está diseñado para concatenar archivos. (Por lo general, mueva todos los archivos a uno). Tampoco cree directorios por capricho.
Como resultado, aborta e informa el error:
mv: target ‘*.tsv’ is not a directory
Ejemplo 2
Ahora si en cambio dices:
$ mv *1.txt *.tsv
El mvcomando se ejecuta con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Ahora, nuevamente, mvverifique si *.tsvexiste. Como no lo hace, el archivo file1.txtse mueve a *.tsv. Es decir: el archivo se renombra *.tsvcon el asterisco y todo.
$ mv *1.txt *.tsv
‘file1.txt’ -> ‘*.tsv’
$ ls
file2.txt *.tsv
Ejemplo 3
Si en cambio dijiste:
$ mkdir *.tsv
$ mv *.txt *.tsv
El mvcomando se ejecuta con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Como *.tsvahora es un directorio, los archivos terminan siendo movidos allí.
Ahora: usando comandos como some_command *.tsvcuando la intención es mantener el comodín, uno siempre debe citarlo. Al citar, evita que los comodines se expandan si hubiera coincidencias. Por ejemplo, decir mkdir "*.tsv".
Ejemplo 4
La expansión se puede ver aún más si lo hace, por ejemplo:
$ ls
file1.txt file2.txt
$ mkdir *.txt
mkdir: cannot create directory ‘file1.txt’: File exists
mkdir: cannot create directory ‘file2.txt’: File exists
Ejemplo 5:
Ahora: el mvcomando puede y funciona en varios archivos. Pero si hay más de dos, el último debe ser un directorio de destino. (Opcionalmente, puede usar la -t TARGET_DIRopción, al menos para GNU mv.)
Entonces esto está bien:
$ ls -F
b1.tsv b2.tsv f1.txt f2.txt f3.txt foo/
$ mv *.txt *.tsv foo
Aquí mvse llamaría 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
y todos los archivos terminan en el directorio foo.
En cuanto a tus enlaces. Ha proporcionado uno (en un comentario), donde mvno se menciona en absoluto, pero rename. Si tiene más enlaces que podría compartir. Así como para las páginas de manual donde usted afirma que esto se expresa.