Como você pode mover ou copiar arquivos específicos de uma lista de arquivos de texto

Como você pode mover ou copiar arquivos específicos de uma lista de arquivos de texto

Portanto, tenho um diretório com cerca de 200 dos seguintes tipos de arquivos:

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

A única diferença entre esses arquivos são os números depois de d. Eu tenho um arquivo de texto que contém apenas o dnúmero de 50 desses arquivos. Se eu pudesse obter o nome completo do arquivo, eu o faria, mas esse arquivo de texto é a saída de outro script. Existe uma maneira de mover esses arquivos para outro diretório usando o dnúmero do arquivo de texto?

Responder1

Usando sed esinalizador:

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|e' list.txt

Acima irá mover os arquivos para newdir/alterá-los de acordo.

Presumo que em list.txt os números sejam os seguintes, separados por uma nova linha:

d34567
d23168

Execute isto para confirmar:

sed 's|^\(.*\)$|mv gre_6_c1_\1.h3 newdir/|' list.txt

Responder2

Com bash4, você pode carregar um array com nomes de arquivos derivados dos números no arquivo "driver" e então usar a -topção do GNU mvpara movê-los para um diretório de uma só vez. Observação

#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[@]}"

Responder3

Lendo os números do arquivo um por um e fazendo a movimentação (assume um 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

Isso também garante que o número produza o nome de um arquivo existente no diretório atual antes de movê-lo para outro diretório. Além disso, o mv -icomando solicitará confirmação antes de substituir um arquivo existente.


Como esta pergunta foi marcada com, poderíamos pedir xargspara gerar a lista de números para nós:

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

Isso não aceleraria nada, mas se você xargsfornecer um -Psinalizador para executar as coisas em paralelo, poderá obter um pequeno aumento de velocidade:

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

Isso iniciaria no máximo cinco cópias do loop em paralelo e daria a cada uma no máximo dez números em lotes.

informação relacionada