2

Вот что я хотел бы сделать в псевдокоде:

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

Что я имею в виду под current_filename_padded_with_zeroes , например, если текущим именем файла является 01.png измените его на 0001.png или 100.png измените его на 0100.png .

Может кто-нибудь помочь мне перевести вышеперечисленное в сценарий bash?

Что-то вроде... Я не уверен, как сделать часть переименования:

#!/bin/bash
for DIR in $(ls) 
do
    for FILENAME in $(ls $DIR)
        do
        mv "$FILENAME" "myprefix_{%FILENAME}"   
        done
done

2 ответа2

2

Используйте следующее, чтобы переименовать все файлы в текущем каталоге:

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

Программа printf похожа на одноименную функцию во многих языках программирования.


Вам нужно использовать basename и dirname чтобы он работал из другого каталога.

1

Используйте printf для заполнения нулей, пока он не будет соответствовать желаемой длине. %04d означает заполнение нулей длиной до 4 цифр (если ваш номер> = 4 цифры, это ничего не изменит). ${a%.png} соответствует части $a перед .png . Некоторые и basename dirname требуются извлечь фактическое имя файла из пути и reconcatenate его.

Вы можете заменить цикл с помощью команды find . -dept 2 .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .