Tengo una carpeta con varios archivos ABC. * (Hay aproximadamente 100 de estos archivos). Quiero duplicarlos todos en archivos nuevos con nombres que comiencen con DEF. *
Entonces yo quiero
ABC.Page1
ABC.Page2
ABC.Topic12
...etc
copiado a
DEF.Page1
DEF.Page2
DEF.Topic12
...etc
¿Cuál es la forma más sencilla de hacer esto con un comando por lotes (en BASH o similar)? Estoy pensando en algo relacionado con sed o awk o xargs, pero tengo dificultades para descubrir la sintaxis. Podría escribir un script de Python, pero creo que probablemente haya una solución de línea de comandos que no sea demasiado complicada.
mc
administrador de archivos venerable tiene un soporte más extenso para este tipo de cambios de nombre masivos.tar
tampoco es un pollo de primavera. Vea mi respuesta para un ejemplo.Respuestas:
¿Qué tal algo como esto en bash:
puedes probarlo poniendo echo delante del comando cp:
fuente
cp /usr/local/lib/libboost* /usr/local/lib/libboost*
con la verificación de eco.Para hacer esto de manera eficiente con una gran cantidad de archivos, es mejor evitar iniciar un
cp
proceso diferente para cada uno. Una forma sería copiarlos y luego renombrarlos usandoprename
(rename
está enlazado a esto por defecto en distribuciones basadas en Debian). Usando esto y Linuxmktemp
:Actualizar
En realidad,
pax
puede ser una mejor manera de ir aquí:Desafortunadamente, a pesar de
pax
ser POSIX y Linux Standard Base, pocas distribuciones lo incluyen por defecto.fuente
tar
Hará esto por usted realmente rápido.PRUEBA
Primero creé 2 directorios y 10 archivos:
Luego los copié:
TRANSFORMAR
Entonces GNU
tar
aceptará unsed --transform=EXPRESSION
cambio de nombre de archivo. Esto incluso puede renombrar solo algunos de los archivos. Por ejemplo:Entonces esa es una ventaja.
CORRIENTE
También considere que esto es solo dos
tar
procesos, y que no se alterará independientemente de su recuento de archivos.tar
está tan optimizado como podría desear que sea. Esto nunca tendrá problemas de conteo de argumentos o procesos secundarios fuera de control. Esto es solo A> B hecho.ARGUMENTOS
Utilizo 7 argumentos distintos combinados entre mis dos
tar
procesos aquí. El más importante se enumera aquí primero:... y al otro lado del
|pipe
...fuente
pax
solución para esta pregunta. Lo agregaría a mi respuesta, pero creo que es más adecuado aquí -pax -rws '/^ABC/DEF/' ABC.* .
pax
se especifica POSIX, de ahí elpax
.pax
puede ser POSIX, pero desafortunadamente rara vez se instala por defecto.Si no le importa usar una herramienta menos estándar, le recomiendo usar mmv (movimiento en masa) que fue escrito para este tipo de tareas. Usando
mcp
(copia masiva), que es parte de la suite, simplemente podría hacerNo es exactamente fácil encontrar paquetes de descarga. Aquí se puede encontrar el paquete Debian actual (que Arch también usa en AUR) para compilar en casa .
fuente
apt-get install mmv
En zsh, ponga las siguientes líneas en su
.zshrc
:Luego, en la línea de comando, puede ejecutar
o simplemente
En otro shell, siempre que tenga instalado zsh:
fuente
Podrías hacer esto:
fuente
"${i#*.}"
bit?Puede hacer esto: http://www.projectik.eu/index.php/programovanie/linux/item/243-linux-kopirovanie-suborov-vo-vlakne Aquí hay un ejemplo
fuente