Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: Astronomy в Jun 15, 2016, 10:21



Титла: Преименуване на всички файлове във всички директории
Публикувано от: Astronomy в Jun 15, 2016, 10:21
Извинете за може би елементарния въпрос, но не мога да се справя с един проблем. ОС е Fedora 23. Имам една директория с много поддиректории в които има около 100 хиляди файла .tif или .pdf.
Как да преименувам всички файлове във всички директории, така че във всяка директория файловете да започват от 00001, после 00002 и тн.

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


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: go_fire в Jun 15, 2016, 10:36
Със сигурност ще стане, ако пуснеш един for с mv, но баша е едно такова отвратително нещо, дето предразполага към огромни грешки и ще трябва петдесет пъти да го пробваш (например с echo) преди да го пуснеш да работи. За това време, може и сам да се оправиш.

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


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: 4096bits в Jun 19, 2016, 17:10
Извинете за може би елементарния въпрос, но не мога да се справя с един проблем. ОС е 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()



Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: Demayl в Jun 20, 2016, 15:18
Ето и това ще стане. Надявам се да се ориентираш.
Код
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' \;


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: 4096bits в Jun 21, 2016, 08:40
find на 100 000 файла?


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: Demayl в Jun 21, 2016, 09:33
ц, търси директории :)


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: 4096bits в Jun 21, 2016, 09:55
Да, това го видях още снощи. Трябва да видя -execdir какви ги върши, че не ми е познато
Харесва ми. На един ред. Трябва да го пробвам на повече файлове, че за проба само на около 1500 го пуснах. Които трябваше да преименувам на pdf-и, че нямам толкова на този дял. Как може да се промени, че върху всички файлове да извърши преименуването, а не да гледа за определени?
Това дето аз го написах набързо изобщо не се интересува какъв е файла.  :D


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: go_fire в Jun 21, 2016, 10:24
За да е всякакви, трябва да махнеш точка, средни скоби и изброяване тиф, пдф. Това -d означава, че е за каталози. Ако искаме обикновени документи, подаваме -f. Екзекдир просто казва, че трябва да се изпълни команда в подкаталога (затова хитреца търси за каталози, по-бавно щеше да е с -f -exec). Конкретната команда е такава дето аз предложих — влез в каталога (change directory), извърти го целия и дето са pdf или tiff ги преименувай (move).

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


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: korea60 в Jun 21, 2016, 18:06
Вярно е че 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)


Извинявам се за редакцията имаше грешка.


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: Demayl в Jun 21, 2016, 21:52
То е ясно, че на всеки език можеш да намериш 0 byte files. Идеята на go_fire беше друга.


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: korea60 в Jun 22, 2016, 21:10
Явно съм се подвел от дума, но наистина най-бързото разписване е с find, визирам кода които бях дал и това за пример:
find . -type f -empty -delete


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: go_fire в Jun 23, 2016, 00:51
А като споменах LHH, та още един вариант е -size 0. Не съм правил замервания, как ще е по-бързо. Предполагаемо, би трябвало да е еднакво.

п.п. UHH, не LHH.


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: 4096bits в Jun 23, 2016, 09:18
Хммм! Аз пък се учудих, колко бързо стана преименуването на около 1400 файла забити къде ли не. На толкова си тествах творението. Ако не седна да правя нещо практично, не сядам и да ръчкам Python-а, а това не помага да се упражнявам на него и да програмирам въобще.

Аз имам друг въпрос. Къде може да се види директно, колко файла има в някоя директория? Мисля, че във самия файл-запис на самата директория се съдържаше такова нещо. Дано не ме лъже паметта. Нали директорията също е файл със запис на структурата ѝ. Май беше нещо такова.


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: go_fire в Jun 23, 2016, 11:07
Код
GeSHi (Bash):
  1. ls -la|wc -l

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

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

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


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: 4096bits в Jun 23, 2016, 12:50
Да, "тръбта" е ясна. И аз така съм броил файлове. Спомням си, че преди време отварях "директория", ма не да ѝ листна поддиректориите и файловете, ми беше самия файл в който се съдържаше всичката тази информация. С още някакви неща.


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: korea60 в Jun 23, 2016, 17:27
Дали не е било командата tree?

накрая вади колко са директориите и колко са файловете. Не съм сигурен дали може да се ползва съвместно с tail -n1.

А за ls | wc -l, за да попаднат и субдиректориите, може би така ls l -R | wc -l?


Титла: Re: Преименуване на всички файлове във всички директории
Публикувано от: 4096bits в Jun 23, 2016, 18:15
Не, не е tree.