Форум русскоязычного сообщества Ubuntu


Автор Тема: bash скрипт для пакетного переименования файлов  (Прочитано 2715 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Alexandr_Letov

  • Автор темы
  • Гость
Написал скрипт для пакетного переименования файлов по шаблону 000.txt - 999.txt

#! /bin/bash
cd /home/alexandr/Загрузки

echo Введите число, с которого должна начинаться нумирация
read a
for i in *.txt; do
mv "$i" `printf "%03d.txt" "$a"`
(( a += 1))
done
В принципе он работает, но как-то странно. В связи с чем возникло два вопроса.
1. Если есть два файла 001.txt и 002.txt, а в качестве аргумента "а" задать двойку, то эти два файла исчезают и появляется один с именем 003.txt. Почему так происходит? Что я делаю не так?  :idiot2:
2. Как заставить его переименовывать файлы в алфавитном порядке? Т.е. Есть три файла:
Cergey.txt
Artem.txt
Boris.txt
Надо чтобы скрипт брал сначала файл Artem и присваивал ему имя 00"а", затем файл Cergey и присваивал имя 00"a+1" и далее по алфавиту.

Оффлайн andwer07

  • Участник
  • *
  • Сообщений: 233
    • Просмотр профиля
1. Если есть два файла 001.txt и 002.txt, а в качестве аргумента "а" задать двойку, то эти два файла исчезают и появляется один с именем 003.txt. Почему так происходит? Что я делаю не так?  :idiot2:
Смотри: если a=2, то в первой итерации цикла выполняется: mv 001.txt 002.txt, тем самым файл 001.txt перемещается в 002.txt, перезаписывая его. Во второй итерации (a=3) выполняется: mv 002.txt 003.txt - 002.txt перемещается в 003.txt.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Alexandr_Letov,
Цитировать
mv "$i" `printf "%03d.txt" "$a"`
а смотреть?
echo "$i" `printf "%03d.txt" "$a"`
Wars ~.o

Оффлайн Стажер

  • Любитель
  • *
  • Сообщений: 54
    • Просмотр профиля
2. Как заставить его переименовывать файлы в алфавитном порядке? Т.е. Есть три файла:
Cergey.txt
Artem.txt
Boris.txt

На Питоне оно было бы так:

L=['Cergey.txt', 'Artem.txt', 'Boris.txt']
L.sort()

i=0
for item in L:
   shutil.move(item, str(i))

А баш я не люблю.

А вообще скрипт был бы такой:

#!/usr/bin/python

import os, shutil

d=raw_input('Enter Dir: ')

L=[]
if os.path.isdir(d)==True:
L=os.listdir(d)
L.sort()

n=len(str(len(L)))
i=0
for f in L:
if os.path.isfile(d+os.sep+f)==True:
i=i+1
ext=f[f.rfind('.'):]
new_name=d+os.sep+('0'+'0'*(n-len(str(i))))+str(i)+ext
shutil.move(d+os.sep+f, new_name)
print new_name

else:
print '"'+d+'"', 'is not a Dir'



Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Код: (bash) [Выделить]
#! /bin/bash
function _renumer {
while :
do
  new=`printf "%03d.txt" "$a"`
  ((a=++))
  if [ -f "$new" ]
  then
    echo "File $new is already exist => trying next number"
  else
    mv -vn "$1" "$new"
    break
  fi
done
}

cd $HOME/Загрузки

echo -n "Введите число, с которого должна начинаться номeрация >>  "
read a
while read
do
  _renumer "$REPLY"
done < <(ls -1A *.txt)

cd -
echo "Job done"
« Последнее редактирование: 15 Августа 2014, 18:53:02 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Alexandr_Letov

  • Автор темы
  • Гость
andwer07, понятно, спасибо.

Стажер, я смотрел в сторону "змия", но быстрее нашёл подходящий скрипт на bash, который можно было переделать для моих нужд. За скрипт на питоне спасибо, думаю он мне тоже пригодится. Решил изучить этот язык.

Azure, большое спасибо.

 

Страница сгенерирована за 0.055 секунд. Запросов: 25.