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 mv
línea es que el shell se expande *.txt
a los archivos coincidentes. Como no hay *.tsv
archivos que no se modifiquen.
El mv
comando 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 mv
programa 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 mv
comando se ejecuta con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[2] = *.tsv
Ahora, nuevamente, mv
verifique si *.tsv
existe. Como no lo hace, el archivo file1.txt
se mueve a *.tsv
. Es decir: el archivo se renombra *.tsv
con 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 mv
comando se ejecuta con:
argc = 3
argv[0] = mv
argv[1] = file1.txt
argv[1] = file2.txt
argv[2] = *.tsv
Como *.tsv
ahora es un directorio, los archivos terminan siendo movidos allí.
Ahora: usando comandos como some_command *.tsv
cuando 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 mv
comando 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_DIR
opció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í mv
se 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 mv
no 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.