
Entonces tengo un directorio de como 200 de los siguientes tipos de archivos:
gre_6_c1_d34567.h3
gre_6_c1_d95543.h3
gre_6_c1_d42354.h3
gre_6_c1_d01452.h3
gre_6_c1_d23168.h3
gre_6_c1_435435.h3
La única diferencia entre estos archivos son los números después de d
. Tengo un archivo de texto que solo contiene el d
número de unos 50 de estos archivos. Si pudiera obtener el nombre completo del archivo, lo haría, pero este archivo de texto es el resultado de otro script. ¿Hay alguna manera de mover estos archivos a otro directorio usando el d
número del archivo de texto?
Respuesta1
Usando sed
e
bandera:
sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|e' list.txt
Arriba moverá los archivos para newdir/
cambiarlos en consecuencia.
Supongo que en list.txt los números están como se muestra a continuación, separados por una nueva línea:
d34567
d23168
Ejecute esto para confirmar:
sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|' list.txt
Respuesta2
Con bash
4, puede cargar una matriz con nombres de archivos derivados de los números en el archivo "controlador" y luego usar la -t
opción de GNU mv
para moverlos a un directorio de una sola vez. Nota
#read contents of driver_file into an array arr using mapfile
mapfile -t arr <driver_file
#define prefix and suffix variables
prefix=gre_6_c1_d
suffix=.h3
#prefix each array element
arr=("${arr[@]/#/$prefix}")
#suffix each array element
arr=("${arr[@]/%/$suffix}")
#use GNU mv's -t facility to move files into newdir
mv -t newdir/ "${arr[@]}"
Respuesta3
Leer los números del archivo uno por uno y realizar el movimiento (se supone un shell POSIX):
while read -r number; do
name="gre_6_c1_d$number.h3"
[ -f "$name" ] && mv -i "gre_6_c1_d$number.h3" /other/directory
done <number.list
Esto también garantiza que el número proporcione el nombre de un archivo existente en el directorio actual antes de moverlo al otro directorio. Además, el mv -i
comando solicitará confirmación antes de sobrescribir un archivo existente.
Dado que esta pregunta fue etiquetada conxargos, podríamos pedir xargs
que nos generen la lista de números:
xargs sh -c '
for number do
name="gre_6_c1_d$number.h3"
[ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
done' sh <number.list
Esto no aceleraría nada, pero si xargs
proporciona una -P
bandera para ejecutar cosas en paralelo, podría obtener un pequeño aumento de velocidad:
xargs -P 5 -n 10 -h sh -c '
for number do
name="gre_6_c1_d$number.h3"
[ -f "$name" ] && mv "gre_6_c1_d$number.h3" /other/directory
done' sh <number.list
Esto iniciaría como máximo cinco copias del ciclo en paralelo y daría a cada una como máximo diez números en lotes.