Script Bash: renomeia todos os arquivos abaixo de um diretório?

2

Aqui está o que eu gostaria de fazer no pseudocódigo:

for subdir in [all first-level subdirectories of the current directory]:
    for file in [all files in subdir]:
        rename file to "myprefix_" + current_filename_padded_with_zeroes

O que quero dizer com current_filename_padded_with_zeroes é, e. se o nome do arquivo atual for 01.png , mude para 0001.png ou 100.png altere para 0100.png .

Alguém pode me ajudar a traduzir o texto acima em um script bash?

Algo como ... Não sei como fazer a parte de renomeação:

#!/bin/bash
for DIR in $(ls) 
do
    for FILENAME in $(ls $DIR)
        do
        mv "$FILENAME" "myprefix_{%FILENAME}"   
        done
done
    
por Richard 09.11.2011 / 23:54

2 respostas

2

Use o seguinte para renomear todos os arquivos no diretório atual:

for file in * ; do
    mv "$file" "myprefix_$( printf "%04d" $file )"
done

O programa printf é semelhante à função do mesmo nome em algumas linguagens de programação.

Você precisa usar basename e dirname para que funcione em um diretório diferente.

    
por 10.11.2011 / 00:00
1

Use printf para preencher zeros até que corresponda ao comprimento desejado. %04d significa preencher zeros com um comprimento de 4 dígitos (se o seu número for > = 4 dígitos, isso não mudará nada). ${a%.png} corresponde à parte de $a antes de .png . Alguns basename e dirname são necessários para extrair o nome do arquivo real do caminho e reconcatená-lo.

Você pode substituir o loop usando find . -dept 2 .

find . -depth 2 -exec bash -c 'FILENAME='basename {}'; mv {} 'printf \'dirname {}\'/%04d.png ${FILENAME%.png}''  \;
    
por 10.11.2011 / 00:22