Quiero cambiar el nombre de los archivos para cambiar su extensión, buscando efectivamente lograr
mv *.txt *.tsv
Pero al hacer esto obtengo:
* .tsv no es un directorio
Me resulta un tanto extraño que los primeros 10 éxitos de Google Show mv
funcionen así.
Respuestas:
Cuando emite el comando:
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:
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:
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:
Ejemplo 2
Ahora si en cambio dices:
El
mv
comando se ejecuta con:Ahora, nuevamente,
mv
verifique si*.tsv
existe. Como no lo hace, el archivofile1.txt
se mueve a*.tsv
. Es decir: el archivo se renombra*.tsv
con el asterisco y todo.Ejemplo 3
Si en cambio dijiste:
El
mv
comando se ejecuta con: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, decirmkdir "*.tsv"
.Ejemplo 4
La expansión se puede ver aún más si lo hace, por ejemplo:
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:
Aquí
mv
se llamaría con: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, perorename
. Si tiene más enlaces que podría compartir. Así como para las páginas de manual donde usted afirma que esto se expresa.fuente
Sé que esto no responde a su pregunta, pero en caso de que estuviera buscando otra forma de cambiar el nombre de los archivos en comparación con su ciclo de solución, ¿por qué no usarlo
find
? He usado este comando muchas veces para reemplazar extensiones de archivo en directorios grandes con cientos de miles de archivos en él. Esto debería funcionar en cualquier sistema compatible con POSIX:Desglose de comandos:
Ejemplo:
fuente
file.abc
->blub.xyz
en múltiples subdirectorios:find . -name "file.abc" -exec sh -c 'mv "$1" "$(dirname $1)/blub.xyz"' _ {} \;
mv *.txt *.tsv
no funcionamv
solo puede cambiar el nombre de un archivo a la vez. Has entendido mal las explicaciones o están equivocadas.mmv
yrename
puede cambiar el nombre de varios archivos a la vez. Pero hay dos versiones derename
alrededor que se llaman de manera diferente. Debería haber muchas preguntas sobre eso aquí.fuente
rename
, nomv
.mv *.txt *.tsv
mv
(por lo general) no se ve*.txt
ni*.tsv
los nombres de archivo expandidos por shell. El número de archivos a los que se expanden estos comodines sería "aleatorio". La única situación en la que esto funciona es si hay un archivo con el nombre*.txt
que será renombrado (literalmente)*.tsv
(sin citar labash
opciónnullglob
no debe establecerse).foo.txt
y uno nombradobaz.tsv
elmv *.txt *.tsv
hará que la carpeta.tsv
de archivos ...Por ejemplo, si usted tiene
asd.txt
yqwe.txt
archivos en el directorio cuando se ejecuta el comandomv *.txt *.tsv
, se trata de mover estos dos archivos en un directorio llamado*.tsv
. Debido a que no existe tal directorio, da un error.fuente
rename(1)
rename
es un guión perl de Larry Wall, el creador de perl. Toma una expresión regular Perl y opera en el nombre del archivo.Instalación
Debian / Ubuntu
Si necesita instalar
rename
en Debian / Ubuntu, puede hacerlofuente
Otra opción a considerar es usar:
*.txt
archivos*.tsv
mientras conserva sus atributos usando la-p
bandera.*.txt
mv
que simplemente cambia el / directorio / nombre de archivo sin mover realmente los archivos a menos que estén en una partición diferente.fuente