Автор Тема: Преименуване на всички файлове във всички директории  (Прочетена 4092 пъти)

Astronomy

  • Напреднали
  • *****
  • Публикации: 22
  • Distribution: Fedora
  • Window Manager: Gnome
    • Профил
    • WWW
Извинете за може би елементарния въпрос, но не мога да се справя с един проблем. ОС е Fedora 23. Имам една директория с много поддиректории в които има около 100 хиляди файла .tif или .pdf.
Как да преименувам всички файлове във всички директории, така че във всяка директория файловете да започват от 00001, после 00002 и тн.

Благодаря предварително!!!
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8798
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Със сигурност ще стане, ако пуснеш един for с mv, но баша е едно такова отвратително нещо, дето предразполага към огромни грешки и ще трябва петдесет пъти да го пробваш (например с echo) преди да го пуснеш да работи. За това време, може и сам да се оправиш.

Затова точно в този случай бих  ти казал да ползваш графично решение. Например в КДЕ се казва Krename. Не знам, как се казва гномското, но просто потърси в хранилището за нещо свързано с rename.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

4096bits

  • Напреднали
  • *****
  • Публикации: 6206
    • Профил
Извинете за може би елементарния въпрос, но не мога да се справя с един проблем. ОС е Fedora 23. Имам една директория с много поддиректории в които има около 100 хиляди файла .tif или .pdf.
Как да преименувам всички файлове във всички директории, така че във всяка директория файловете да започват от 00001, после 00002 и тн.

Благодаря предварително!!!

Здравей!
Копирай пълния път до директорията, в която са ти файловете и го сложи на мястото на './test/'.
Не забравяй наклонената черта накрая.
Запиши го  като например rename.py и или можеш да го направиш изпълним с chmode +x rename.py с администраторки права за командата и после да го стартираш от терминала, или можеш да го стартираш с python rename.py.
Трябва да имаш права за запис в директорията в която ще ти е скрипта, защот в същата директория ще ти запише и нещо като логфайл.
Дано да ти свърши работа. При теста работи.
Ако не си намерил друг начин. Гледам, че темата е отпреди 4 дена.
Май ще мога и скрипта да прикача

Малка поправка. Нов ред за всеки запис във логфайла, да е по-четимо. Новото име е renamer.py

Код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import os.path
from datetime import datetime

ROOT_DIR = "./test/"

def file_rename(path,):
counter = 0
with open('rename.log','w') as log_file:
for root, dirs, files in os.walk(path):

print(root + '\n')
log_file.write(root + '\n')

if files:
num_files = len(str(len(files)))

for n, f in enumerate(files, 1):
old_name = os.path.join(root, f)
new_name = "{:0>{}d}".format(n, num_files) + \
os.path.splitext(f)[1]
file_full_path = os.path.join(root, new_name)
result = ''
os.rename(old_name, file_full_path)
counter += 1
result = "\tDone: {} ---> {}".format(f, new_name)
log_file.write(result + '\n')
print(result)
return counter
def main():
start = datetime.now()
files = file_rename(ROOT_DIR)
end = datetime.now()
print("\n\nAll done! " + str(files) + " files renamed in " + str(end - start) + " (h:min:sec).")
print("Logfile 'rename.log' saved in ./!")
if __name__ == '__main__':
main()

« Последна редакция: Jun 19, 2016, 18:56 от 4096bits »
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
Ето и това ще стане. Надявам се да се ориентираш.
Код
GeSHi (Bash):
  1. find . -type d -execdir bash -c 'cd {}; A=0; for i in *.{pdf,tif}; do mv $i $(printf "%05d$i" $A); A=$[$A+1]; done' \;
Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 6206
    • Профил
find на 100 000 файла?
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
ц, търси директории :)
Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 6206
    • Профил
Да, това го видях още снощи. Трябва да видя -execdir какви ги върши, че не ми е познато
Харесва ми. На един ред. Трябва да го пробвам на повече файлове, че за проба само на около 1500 го пуснах. Които трябваше да преименувам на pdf-и, че нямам толкова на този дял. Как може да се промени, че върху всички файлове да извърши преименуването, а не да гледа за определени?
Това дето аз го написах набързо изобщо не се интересува какъв е файла.  :D
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8798
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
За да е всякакви, трябва да махнеш точка, средни скоби и изброяване тиф, пдф. Това -d означава, че е за каталози. Ако искаме обикновени документи, подаваме -f. Екзекдир просто казва, че трябва да се изпълни команда в подкаталога (затова хитреца търси за каталози, по-бавно щеше да е с -f -exec). Конкретната команда е такава дето аз предложих — влез в каталога (change directory), извърти го целия и дето са pdf или tiff ги преименувай (move).

Аз сигурно щях да го пробвам малко по-различно. Нещо с xargs, тъй като той по-принцип е най-бърз. Find както  обичам да казвам, не случайно си има собствена глава в „Unix haters handbook“. Но пък е полезен. Е преди време трябваше да намеря  всички документи с нулева големина, а това никой освен find не го умее.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

korea60

  • Напреднали
  • *****
  • Публикации: 189
    • Профил
Вярно е че find се разписва по-бързо, но в никакъв случай не е единствен вариант за 0-ев фаил:

Path = "pat"

import os
from fnmatch import fnmatch
pattern = ('jph', 'txt')

def search(Path):
   for root, path, filename in os.walk(Path):
       for file in filename:
                if fnmatch(file, pattern):
          yield os.path.join(root,file)

result = [m for m in search(Path)]
print filter(lambda x: os.stat(x).st_size == 0, result)


Извинявам се за редакцията имаше грешка.
« Последна редакция: Jun 21, 2016, 18:08 от korea60 »
Активен

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
То е ясно, че на всеки език можеш да намериш 0 byte files. Идеята на go_fire беше друга.
Активен

korea60

  • Напреднали
  • *****
  • Публикации: 189
    • Профил
Явно съм се подвел от дума, но наистина най-бързото разписване е с find, визирам кода които бях дал и това за пример:
find . -type f -empty -delete
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8798
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
А като споменах LHH, та още един вариант е -size 0. Не съм правил замервания, как ще е по-бързо. Предполагаемо, би трябвало да е еднакво.

п.п. UHH, не LHH.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

4096bits

  • Напреднали
  • *****
  • Публикации: 6206
    • Профил
Хммм! Аз пък се учудих, колко бързо стана преименуването на около 1400 файла забити къде ли не. На толкова си тествах творението. Ако не седна да правя нещо практично, не сядам и да ръчкам Python-а, а това не помага да се упражнявам на него и да програмирам въобще.

Аз имам друг въпрос. Къде може да се види директно, колко файла има в някоя директория? Мисля, че във самия файл-запис на самата директория се съдържаше такова нещо. Дано не ме лъже паметта. Нали директорията също е файл със запис на структурата ѝ. Май беше нещо такова.
« Последна редакция: Jun 23, 2016, 09:20 от 4096bits »
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8798
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Код
GeSHi (Bash):
  1. ls -la|wc -l

„Структурата“ тръба просто пренасочва входа и изхода на една програма към друга. Вц означава „преброяване на думи“. Но може също така да брои редове и точно това съм му казал. Затова и на ls съм му подал -l, защото понякога той не показва всеки документ/каталог като отделен ред.

Обаче имай предвид, че с -a трябва да извадиш две за действителният брой, защото wc ще преброи също . и .. (текущ каталог и бащин каталог). Обаче без -а няма да изброи скритите. Ако си подал на ls някакъв шаблон, няма да е зле да сложиш и едно -d.

п.п. Всяка функция на текстов процесор (например LO Writer) може да я откриеш като команда в командният ред, защото Юникс практически е това — работа с текст.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

4096bits

  • Напреднали
  • *****
  • Публикации: 6206
    • Профил
Да, "тръбта" е ясна. И аз така съм броил файлове. Спомням си, че преди време отварях "директория", ма не да ѝ листна поддиректориите и файловете, ми беше самия файл в който се съдържаше всичката тази информация. С още някакви неща.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.