Arquivo de lote renomeia com pesquisa de substituição

3

Usando o bash, como posso renomear em lote um grande número de arquivos, onde preciso construir um novo nome para cada arquivo, com base em seu nome existente e em um 'mapa contextual' - não sei mais o que chamar - de fragmentos de nome.

Eu tenho muitos arquivos assim:

001.jpg
003.jpg
004.jpg
007.jpg
...

e um mapa como este:

001,white
003,grey
004,red
007,green
...

E agora eu quero renomear todos os arquivos, para que 001.jpg se torne 001-white.jpg, etc.

Como posso fazer isso?

    
por mikkelbreum 09.11.2013 / 17:18

4 respostas

2

bash4: Primeiro leia os mapeamentos em uma matriz

declare -A arr2
while IFS=, read -r -a arr; do
    arr2[${arr[0]}]="${arr[1]}";
done < mapfile.txt

Em seguida, renomeie

for f in [0-9][0-9][0-9].jpg; do
    if [[ "${arr2[${f%.*}]+_}" ]]
    then
        mv -- "${f}" "${f%.*}"-"${arr2[${f%.*}]}"."${f##*.}";
    else
        mv -- "${f}" "${f%.*}"-default."${f##*.}";
    fi
 done
    
por 09.11.2013 / 18:04
2

Você pode simplesmente executar

join -t. -j1 <(tr , . < map) filelist | sed 's/\./-/' | paste filelist - | xargs -L1 mv

em que map é o mapa contextual e filelist é a lista de arquivos. A junção será dividida em . e usa o primeiro campo como um valor de associação; ambas as listas devem ser classificadas. paste então colará cada linha de filelist com o nome do arquivo recém-gerado juntos em uma linha, enquanto xargs chama mv em cada uma dessas linhas.

    
por 09.11.2013 / 18:22
1

Aqui você vai:

for file in [0-9][0-9][0-9].jpg;do
    name="${file%%.*}" # Remove extension
    map="$(grep "$name" map_file | cut -d',' -f 2)"
    echo mv "$file" "$name-$map".jpg
done

Isso pressupõe que o "mapa" esteja no arquivo map_file . Em versões recentes do Bash, você também pode transformar esse arquivo em um array associativo e usá-lo por conveniência (em vez de passar pelo map_file para cada novo arquivo que você deseja renomear).

A propósito, isso só irá echo o mv comandos. Remova o echo quando achar que tudo está em ordem para fazer a renomeação.

    
por 09.11.2013 / 17:54
1
< map sed 's/\([^,]*\),\(.*\)/mv -- ".jpg" "-.jpg"/' | sh -x

(que pressupõe que o arquivo de mapa não contém caracteres " , $ , backslash ou backtick.

    
por 09.11.2013 / 21:12

Tags