Skrypt Bash: zmień nazwę wszystkich plików poniżej katalogu?

2

Oto, co chciałbym zrobić w pseudokodzie:

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

Rozumiem przez current_filename_padded_with_zeroesto, że np. Bieżąca nazwa pliku jest 01.pngzmieniona na 0001.pnglub 100.pngzmień na 0100.png.

Czy ktoś może mi pomóc przetłumaczyć powyższe na skrypt bash?

Coś w stylu ... Nie jestem pewien, jak wykonać zmianę nazwy części:

#!/bin/bash
for DIR in $(ls) 
do
    for FILENAME in $(ls $DIR)
        do
        mv "$FILENAME" "myprefix_{%FILENAME}"   
        done
done
Richard
źródło

Odpowiedzi:

2

Wykonaj następujące czynności, aby zmienić nazwę wszystkich plików w bieżącym katalogu:

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

printfProgram jest podobna do funkcji o tej samej nazwie w dość kilka języków programowania.


Musisz użyć basenamei, dirnameaby działał z innego katalogu.

Daniel Beck
źródło
1

Użyj, printfaby wstawiać zera, aż osiągnie żądaną długość. %04doznacza wypełnianie zer do długości 4 cyfr (jeśli twój numer to> = 4 cyfry, nic to nie zmieni). ${a%.png}pasuje do części $awcześniejszej .png. Niektóre basenamei dirnamejest wymagane, aby wyodrębnić rzeczywistą nazwę pliku ze ścieżki i ponownie go skatować.

Możesz zastąpić pętlę za pomocą find . -dept 2.

find . -depth 2 -exec bash -c 'FILENAME=`basename {}`; mv {} `printf \`dirname {}\`/%04d.png ${FILENAME%.png}`'  \;
Jens Erat
źródło