Титла: Преименуване на всички файлове във всички директории Публикувано от: 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. Здравей! Копирай пълния път до директорията, в която са ти файловете и го сложи на мястото на './test/'. Не забравяй наклонената черта накрая. Запиши го като например rename.py и или можеш да го направиш изпълним с chmode +x rename.py с администраторки права за командата и после да го стартираш от терминала, или можеш да го стартираш с python rename.py. Трябва да имаш права за запис в директорията в която ще ти е скрипта, защот в същата директория ще ти запише и нещо като логфайл. Дано да ти свърши работа. При теста работи. Ако не си намерил друг начин. Гледам, че темата е отпреди 4 дена. Май ще мога и скрипта да прикача Малка поправка. Нов ред за всеки запис във логфайла, да е по-четимо. Новото име е renamer.py Код: #!/usr/bin/env python Титла: Re: Преименуване на всички файлове във всички директории Публикувано от: Demayl в Jun 20, 2016, 15:18 Ето и това ще стане. Надявам се да се ориентираш.
Код
Титла: 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 Код
„Структурата“ тръба просто пренасочва входа и изхода на една програма към друга. Вц означава „преброяване на думи“. Но може също така да брои редове и точно това съм му казал. Затова и на 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.
|