
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 d
nú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 d
número do arquivo de texto?
Responder1
Usando sed
e
sinalizador:
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 bash
4, você pode carregar um array com nomes de arquivos derivados dos números no arquivo "driver" e então usar a -t
opção do GNU mv
para 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 -i
comando solicitará confirmação antes de substituir um arquivo existente.
Como esta pergunta foi marcada comxargs, poderíamos pedir xargs
para 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ê xargs
fornecer um -P
sinalizador 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.