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


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

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

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

  • Старожил
  • *
  • Сообщений: 14868
  • Я не слышу.
    • Просмотр профиля
Alexandr_Letov,
Цитировать
mv "$i" `printf "%03d.txt" "$a"`
а смотреть?
echo "$i" `printf "%03d.txt" "$a"`
~.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

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5633
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Код: Bash
  1. #! /bin/bash
  2. function _renumer {
  3. while :
  4. do
  5.   new=`printf "%03d.txt" "$a"`
  6.   ((a=++))
  7.   if [ -f "$new" ]
  8.   then
  9.     echo "File $new is already exist => trying next number"
  10.   else
  11.     mv -vn "$1" "$new"
  12.     break
  13.   fi
  14. done
  15. }
  16.  
  17. cd $HOME/Загрузки
  18.  
  19. echo -n "Введите число, с которого должна начинаться номeрация >>  "
  20. read a
  21. while read
  22. do
  23.   _renumer "$REPLY"
  24. done < <(ls -1A *.txt)
  25.  
  26. cd -
  27. echo "Job done"
  28.  
« Последнее редактирование: 15 Август 2014, 18:53:02 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Alexandr_Letov

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

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

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

 

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