Renomeia arquivos com base em parte de um arquivo

0

Como renomeio 2009-08-2009-08-13 para 2009-08- $ my_var_till_2009-08-13 para vários arquivos? A parte 2009-08-13 muda em relação à data do arquivo, então eu preciso de uma maneira de pegar essa parte do nome do arquivo. Eu poderia usar o basename de alguma forma?

    
por random 21.09.2009 / 02:54

5 respostas

1

Se os nomes dos arquivos estiverem sempre nesse formato de data, acho que algo assim funcionaria (em um script) - isto é, obviamente, assumindo que eles estão todos no mesmo diretório e '$ my_var_till' está definido na casca:

#!/bin/bash

cd <name_of_target_directory>

for i in 'ls'
do
    yyyy='echo $i | awk -F- '{print $3}''
    mm='echo $i | awk -F- '{print $4}''
    dd='echo $i | awk -F- '{print $5}''

    mv $i "$yyyy-$mm-$my_var_till-$yyyy-$mm-$dd"
done

se '$ my_var_till' não estiver definido no shell, você poderá tomá-lo como um argumento de linha de comando (é claro que você pode querer adicionar alguma verificação de erro com o argumento):

#!/bin/bash

my_var_till=$1
<continue on with code from above>
    
por 21.09.2009 / 03:25
1

Se você tiver o utilitário rename (há vários deles, eu acho que tenho a versão perl):

rename -n -e 's/(\d{4}-\d{2})-([\d-]+)/$1'"$your_variable"'$2/' *

Esse -n sinalizador significa que rename não altera nenhum arquivo, apenas mostra o que mudaria. Remova-o para renomear os arquivos.

    
por 29.08.2016 / 03:56
0

Este script renomeará qualquer arquivo com um nome como

this: 2009-08-2009-08-13
to:   2009-08-${my_var_till}_2009-08-13

Por exemplo, se my_var_till="whatever" e filename = "2009-08-2009-08-13" , o resultado será:

mv "2009-08-2009-08-13" "2009-08-whatever_2009-08-13"

Arquivos com nomes que não estão nesse formato serão ignorados.

Tente isto:

#!/bin/bash

my_var_till="whatever"

for f in *
    # test if file is proper format
    echo "${f}"|grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{4}-[0-9]{2}-[0-9]{2}$'>/dev/null
    if [ $? -eq 0 ]; then
        n=$(echo ${f}|sed -r 's/^(.{8})(.{10})$/'"${my_var_till}_/")
        mv "${f}" "${n}"
    fi
done
    
por 04.02.2014 / 12:58
0

mmv pode ajudar:

If you ever have to rename or move multiple files under Linux, then the mmv shell command will make your life easy. The mmv utility will also come in handy for copying multiple files, appending content of one file to other files, as well as for creation of links.

    
por 22.09.2009 / 14:35
-1

Linux:

obrigatório 1-liner ...

for i in 'ls';do echo $i | awk -F- '{print "mv "$1"-"$2"-"$3"-"$4"-"$5" "$1"-"$2"-""'"$my_var_till"'""-"$3"-"$4"-"$5}';done

expandido

#!/bin/bash
my_var_till=somevalue  # can replace with $1 to use command-line arg to script
for i in 'ls'
     do echo $i | awk -F- '{print "mv "$1"-"$2"-"$3"-"$4"-"$5" "$1"-"$2"-""'"$my_var_till"'""-"$3"-"$4"-"$5}'
done

você também pode usar o comando rename e fornecer um regex Perl.

assumindo que sua variável é uma variável que você definiu no shell, que é o que eu acho que você está perguntando.

Windows:

rename 2009-08* 2009-08-%my_var_till%_*
    
por 21.09.2009 / 02:59

Tags