¿Hay una manera inteligente de copiar y mover operaciones o un comando para duplicar un archivo, sin tener que hacer un cd
, luego mv
, en la misma carpeta?
Por ejemplo, tengo que ejecutar lo siguiente:
mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Tenga en cuenta que el directorio donde estoy moviendo el archivo es el mismo, pero tengo que volver a poner toda la ruta y, a veces, se vuelve molesto. Tengo curiosidad por saber si hay otra forma de hacerlo sin tener que poner todo el camino nuevamente , porque la operación se haría en el mismo camino.
Respuestas:
Simplemente use la expansión de llaves :
Esto es equivalente a escribir:
La expansión de llaves le permite proporcionar más argumentos, por supuesto. Incluso puede pasar rangos a ella, por ejemplo, para crear un par de carpetas de prueba, puede ejecutar
mkdir test_{a..z}
, y comenzando con Bash 4, puede crear secuencias con relleno de ceros, así, como entouch foo{0001..3}
, lo que creafoo0001
,foo0002
yfoo0003
. El golpe de hackers Wiki tiene un artículo con un par de ejemplos para usted.Si tiene que usar dos comandos diferentes, use una subshell y
cd
allí primero, como en la respuesta de @ Ignacio .fuente
brace
expansión, ¡gracias!meniac ~: mv /tmp/f1/f2/f3/f4/f5/f6/{file.txt, file2.txt} mv: cannot stat ``/tmp/f1/f2/f3/f4/f5/f6/{file.txt,': No such file or directory
/bin/bash
, y no estás en un script que tiene/bin/sh
en el shebang o algún otro shell que no admite la expansión de llaves? Si corresset
, ¿tuSHELLOPTS
contenidobraceexpand
?file.txt,
yfile2.txt
.mv /folder1/folder2/folder3/file{,-2013}.txt
Ejecute la operación en una subshell.
El cambio del directorio de trabajo no se propagará al shell principal.
fuente
ash
,dash
,ksh88
Por no hablar de la vieja cáscara de bourne son ejemplo de conchas que no lo soporte.Si quieres inteligente, aquí está la expansión de la historia bash
No usaría esto yo mismo, ya que me resulta imposible memorizar. De vez en cuando uso el equivalente vim , pero tengo que buscarlo casi siempre.
fuente
Puedes establecer una variable. Por supuesto, esto tiene el efecto secundario de dejar las variables.
fuente
(D="/folder1/folder2/folder3"; mv "$D"/file.txt "$D"/file-2013.txt)
o simplemente agregando ununset
comando al final. (Agregué citas como una "mejor práctica"; si tiene la costumbre de usar siempre citas, no tendrá que detenerse y rascarse la cabeza cuando aparezca un nombre de ruta que contenga caracteres especiales).cd
que establecer una variable. No mucho más fácil, lo admito.Me gustan las otras soluciones, pero aquí hay otra, implementada como un script con matrices bash, pushd, popd:
fuente
Slhck responde directamente a la pregunta de la manera más simple posible, pero a Valter también le gusta la respuesta de autopop, así que aquí hay una que sigue la misma línea;
fuente