Переименование набора файлов в 001, 002, ... в Linux - PullRequest
20 голосов
/ 19 мая 2009

У меня изначально был набор изображений вида image_001.jpg, image_002.jpg, ...

Я прошел их и удалил несколько. Теперь я хотел бы переименовать оставшиеся файлы обратно в image_001.jpg, image_002.jpg, ...

Есть ли команда Linux, которая сделает это аккуратно? Я знаком с переименованием, но ничего не вижу, чтобы упорядочить такие имена файлов. Я думаю, что, поскольку ls *.jpg перечисляет файлы по порядку (с пробелами), решением было бы передать вывод этого в цикл bash или что-то?

Ответы [ 6 ]

13 голосов
/ 19 мая 2009

Если я правильно понимаю, у вас есть, например, image_001.jpg, image_003.jpg, image_005.jpg, и вы хотите переименовать в image_001.jpg, image_002.jpg, image_003.jpg.

РЕДАКТИРОВАТЬ: Это изменено, чтобы поместить временный файл в текущий каталог. Как отметил Stephan202, это может иметь существенное значение, если temp находится в другой файловой системе. Чтобы избежать попадания во временный файл в цикле, теперь он проходит через изображение *

i=1; temp=$(mktemp -p .); for file in image*
do
mv "$file" $temp;
mv $temp $(printf "image_%0.3d.jpg" $i)
i=$((i + 1))
done                                      
9 голосов
/ 19 мая 2009

Простой цикл (тест с echo, выполнение с mv):

I=1
for F in *; do
  echo "$F" `printf image_%03d.jpg $I`
  #mv "$F" `printf image_%03d.jpg $I` 2>/dev/null || true
  I=$((I + 1))
done

(я добавил 2>/dev/null || true для подавления предупреждений об одинаковых исходных и целевых файлах. Если это не нравится вам, перейдите с Мэтью Флешен * ответ .)

2 голосов
/ 24 сентября 2014

Попробуйте следующий скрипт:

numerate.sh

Этот отсканированный код должен выполнять работу:

./numerate.sh -d <your image folder> -b <start number> -L 3 -p image_ -s .jpg -o numerically -r
1 голос
/ 19 мая 2009

Некоторые хорошие ответы уже здесь; но некоторые полагаются на сокрытие ошибок, что не является хорошей идеей (в которой предполагается, что mv будет ошибкой только из-за ожидаемого условия - как насчет всех других причин, mv может привести к ошибке?).

Более того, это может быть сделано немного короче и должно быть лучше процитировано:

for file in *; do
    printf -vsequenceImage 'image_%03d.jpg' "$((++i))"
    [[ -e $sequenceImage ]] || \
        mv "$file" "$sequenceImage"
done

Также обратите внимание, что вы не должны использовать заглавные буквы в скриптах bash.

1 голос
/ 19 мая 2009

Это полностью противоположно тому, что вы спрашиваете (беря файлы вида * .jpg.001 и конвертируя их в * .001.jpg), но может быть легко изменено для вашей цели:

for file in * 

do

if [[ "$file" =~ "(.*)\.([[:alpha:]]+)\.([[:digit:]]{3,})$" ]]

then

mv "${BASH_REMATCH[0]}" "${BASH_REMATCH[1]}.${BASH_REMATCH[3]}.${BASH_REMATCH[2]}"

fi

done
0 голосов
/ 19 мая 2009

Я собирался предложить что-то подобное выше, используя цикл for, итератор, cut -f1 -d "_", затем mv i i.iterator. Похоже, что это уже покрыто другими способами.

...