¿Cómo se pueden mover o copiar archivos específicos de una lista de archivos de texto?

¿Cómo se pueden mover o copiar archivos específicos de una lista de archivos de texto?

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 dnú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 dnúmero del archivo de texto?

Respuesta1

Usando sed ebandera:

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 bash4, puede cargar una matriz con nombres de archivos derivados de los números en el archivo "controlador" y luego usar la -topción de GNU mvpara 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 -icomando solicitará confirmación antes de sobrescribir un archivo existente.


Dado que esta pregunta fue etiquetada con, podríamos pedir xargsque 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 xargsproporciona una -Pbandera 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.

información relacionada