Batch script care sa refaca structura folderelor din fisiere txt
Last Updated: Nov 18 2021 21:56, Started by
entry
, Nov 17 2021 10:43
·
0
#1
Posted 17 November 2021 - 10:43
Am un folder cu mai multe fisiere txt care contin structura unor foldere, cu subfoldere si fisiere. Tot in acest folder am si fisierele mentionate in aceste txt files. Vreau sa folosesc un batch script care sa citeasca aceste fisiere txt, sa refaca structura folderelor si a subfolderelor si sa mute fisierele in respectivele foldere si subfoldere.
Pentru crearea acestor fisiere txt am folosit acest script @For /D %%G In (*) Do tree "%%G" /A /F >"%%G\%%~nxG.txt" Daca il rulez dintr-un director care contine mai multe foldere va pune cate un fisier txt in fiecare dintre aceste foldere, dar nu in subfoldere, le numeste dupa folderele respective si le scrie cu continutul acelor foldere. Rezultatul va fi de felul acesta Folder PATH listing for volume Local Disk Volume serial number is BCDF-775D D:\AUDIOBOOKS\MINDFULNESS IN 8 WEEKS | +---AudioBook | Mindfulness in Eight Weeks.epub | Mindfulness in Eight Weeks.mp3 | \---Practice 01. The Raisin Exercise.mp3 02. The Body Scan (Longer Version).mp3 03. The Body Scan (Shorter Version).mp3 04. Mindfulness of Breathing 10 mins.mp3 05. Mindfulness of Breathing 5 mins.mp3 Asa arata un folder numit Mindfulness in 8 Weeks care contine 2 subfoldere (AudioBooks si Practice) cu respectivele fisiere. Eu vreau ca pornind de la aceste fisiere txt cu strucura folderelor si de la fisierele propriu zise sa refac structura folderelor si sa mut fisierele in acele foldere. |
#2
Posted 17 November 2021 - 11:09
Batchul este destul de limitat. Iti recomand sa incerci in power shell sau si mai bine in python.
|
#3
Posted 17 November 2021 - 11:39
Sau in Javascript daca initiatorul il cunoaste mai bine decat Python. Pentru accesul la fisiere pleaca de la un obiect creat cu new ActiveXObject ("Scripting.FileSystemObject"). De acolo sunt metode si poprietati pentru enumerat fisiere si directoare, creat subdirectoare, redenumit/mutat fisiere, etc. Si mie posibilitatile unui *.bat mi se par mult prea primitive pentru ce doreste initiatorul.
|
#6
Posted 17 November 2021 - 14:29
@MarianG: Pe acest topic vrea invers, are lista (de fapt un ‘ASCII tree’) si are de creat directoarele si mutat fisiere in ele. Ce ii zici tu vroia pe un topic de acum cateva zile .
|
#7
Posted 17 November 2021 - 15:18
Problema e ca nu sunt programator, nu stiu cum sa fac lucrurile astea in VB script, Javascript sau Python. De o saptamana incerc sa gasesc aceste solutii si e dificil fara cunostinte tehnice. De aceea am cerut ajutor aici unde sunt persoane cu experienta in progamare. Solutia poate sa fie diferita de batch script, orice merge pe Windows, chiar si scriptul care genereaza structura folderelor poate fi modificat daca e nevoie.
Am nevoie sa execut scriptul dintr-un director care contine foldere, sa genereze fisiere in acele foldere care sa contina structura folderelor respective. Apoi am nevoie sa fac invers, intr-un folder gol sa pun fisierele text cu structura folderelor, fisierele extrase din foldere si sa rulez scriptul acolo care imi genereaza folderele si imi pune la loc fisierele. |
#8
Posted 17 November 2021 - 15:57
STOP! Frana! Fa-ma sa inteleg.
Daca lipseste un fisier cum il restaurezi ? Asta prespunad ca rezolvi problema cu arborele si ramurile directoarelor. Tosusi, cred ca tie ti-ar prinde mai bine o solutie de backup decat sa te avanti in "scripting" si "peticeli". |
#9
Posted 17 November 2021 - 16:08
Scriptul ar trebui sa compare fisierele existente cu cele din structura foderelor, ce gaseste pune in foldere si trece peste cele pe care nu le gaseste, eventual cu un log care sa cuprinda ce n-a gasit. Backup nu e o solutie pentru mine. Sunt in situatia in care am fisiere "orfane" si am la dispozitie doar structura folderelor.
|
#10
Posted 17 November 2021 - 17:20
Stai sa vad daca inteleg bine:
Edited by sags, 17 November 2021 - 17:23. |
|
#12
Posted 17 November 2021 - 21:00
O sa explic concret ce vreau sa fac. Pot sa uploadez fisiere in cloud dar fara foldere. Daca vreau sa le descarc o sa am o groaza de fisiere care nu mai stiu de unde provin, ordinea si structura folderelor in care au fost fiind pierduta. De aceea inainte sa le urc vreau sa le atasez cate un sumar cu structura folderelor astfel incat cand le descarc sa le pot rearanja asa cum au fost initial.
De pilda am un director Backup si in el 20 de foldere. Fiecare folder e o entitate in sine, un curs de chitara, o carte audio, o serie de documentare, etc. Vreau ca in folderul Backup sa rulez un script, el imi pune in fiecare folder cate un fisier text cu ierarhia folderului respectiv. Vreau ca fiecare folder sa aiba fisierul lui separat, astfel incat daca descarc doar cursul respectiv sa am sumarul lui. Vreau sa simplific maxim, sa nu fiu nevoit sa scriu mereu path-ul, scriptul sa ruleze default in directorul in care se afla si sa puna fisierele cu sumarul in folderele din directorul sursa. Invers cand descarc fisierele intr-un director oarecare, nu vreau sa fiu nevoit sa scriu path-ul, scriptul sa actioneze default in directorul in care ruleaza. De exemplu il rulez in directorul X el cauta default in directorul X fisierele text cu ierarhia folderelor, reface structura folderelor si muta fisierele mentionate in acea structura la locul lor. Totul se petrece in acelasi folder X. Cu privire la solutile sugerate am incercat asa dir /s /b /a-d >listafisiere.txtrulat in directorul sursa, tot acolo a creat si fisierul, nu in folderul din director. Al doilea script nu am reusit sa-l fac sa mearga, cred ca am gresit ceva. Asa arata for /F "delims=" %L in (D:\Backup\listafisiere.txt) do (mkdir "%~pL" && move "D:\Backup\%~nxL" "%~pL")In folderul Backup am fisierul text si fisierele care trebuie mutate, dar nu se intampla nimic cand rulez scriptul. |
#13
Posted 17 November 2021 - 22:12
dir /s /b /a-d >listafisiere.txt Cred că îţi trebuie calea relativă a fişierelor din root-ul de backup. Deci rulezi batul din root-ul de back cu asta ca să generezi lista de fisiere. forfiles /S /C "cmd /c if @isdir==FALSE echo @relpath" >listafisiere.txt Cu noua listă încearcă să rulezi al doilea batch in celălalt folder root. for /F "delims=" %%L in (lista.txt) do (mkdir "%%~pL" && move "%%~nxL" "%%~pL") Ai nevoie de lista.txt in fiecare subfolder doar în cazul în care modifici folderul de backup (ceea ce pare a fi cazul) Edited by afh, 17 November 2021 - 22:22. |
#14
Posted 17 November 2021 - 23:55
entry, on 17 noiembrie 2021 - 21:00, said: … Cu privire la solutile sugerate am incercat asa dir /s /b /a-d >listafisiere.txtrulat in directorul sursa, tot acolo a creat si fisierul, nu in folderul din director. … for /d %D in (*) do dir /s /b /a-d "%D" >"%D\%D.txt". In loc de dir poti folosi forfiles cum a scris colegul mai sus ca sa obtii direct calea relativa si nu mai ai de editat ulterior lista (sau listele) de fisiere.LE: Mai incercand vad o problema cu aceasta comanda: fisierul de iesire ‘polueaza’ lista pentru ca apare si el in ea. entry, on 17 noiembrie 2021 - 21:00, said: … Al doilea script nu am reusit sa-l fac sa mearga, cred ca am gresit ceva. Asa arata for /F "delims=" %L in (D:\Backup\listafisiere.txt) do (mkdir "%~pL" && move "D:\Backup\%~nxL" "%~pL")In folderul Backup am fisierul text si fisierele care trebuie mutate, dar nu se intampla nimic cand rulez scriptul. Si la fel ca mai sus, aceasta comanda trateaza o singura lista. Daca ai mai multe trebuie sa o executi pentru fiecare lista, fiecare din acestea avand propriul sau director radacina. Totusi cred ca ar trebui sa rezolvi cu copierea in cloud, sa iti pastreze structura de directoare. Ca asa cum zici ca e acum, daca deschizi directorul din cloud e un talmes-balmes total acolo. Unde mai pui ca poti si pierde fisiere: ce se intampla daca doua fisiere, initial in directoare diferite, au acelasi nume? Nu cumva primul salvat e suprascris de al doilea si deci il pierzi definitiv? Edited by sags, 18 November 2021 - 00:01. |
#15
Posted 18 November 2021 - 10:46
daca sunt mp3-uri, vad mai simplu un comment in ID3 tags
|
|
#16
Posted 18 November 2021 - 15:32
merge făcut cu forfiles, dar fiecare pas va avea 2 fişiere bat (fiindcă se pare că nu poţi apela o funcţie de acelaşi bat din forfiles), în total 4 baturi în root-ul de backup
evident, numele fişierelor trebuie să fie unic pe toate subfolderele, dacă vrei să le pui pe toate înapoi în rootul de back-up înainte să recreezi folderul iniţial Pasul 1: makelist.bat set run=%~dp0makelist2.bat forfiles /C "cmd /c if @isdir==TRUE call %run% @path" makelist2.bat del /F %~1\warez_spam_%~n1%.txt for /f "delims=" %%i in ('forfiles /P %1 /S /C "cmd /c if @isdir==FALSE echo @relpath"') do echo .\%~n1\%%~i>> %~1\warez_spam_%~n1%.txt Pasul 2: movefiles.bat set run=%~dp0movefiles2.bat forfiles /M warez_spam_*.txt /C "cmd /c if @isdir==FALSE call "%run%" @path" forfiles /M warez_spam_*.txt /C "cmd /c if @isdir==FALSE del @path" movefiles2.bat for /F "delims=" %%L in (%~f1) do (mkdir "%%L\..") for /F "delims=" %%L in (%~f1) do (move "%%~nxL" "%%L") |
#17
Posted 18 November 2021 - 16:22
Am testat asa
for /d %%D in (*) do forfiles /S /C "cmd /c if @isdir==FALSE echo @relpath" >"%%D\%%D.txt"Daca il rulez din directorul A care are 3 foldere 1, 2 si 3, imi pune cate un fisier text in fiecare dintre acestea. Fiecare fisier are numele folderului in care este. Pana aici bine. Problema e ca fiecare fisier text are continutul celor 3 foldere, eu vreau ca fiecare fisier sa contina doar structura folderului in care se afla acel fisier. Imi trebuie fisierul 1=continutul din folderul 1, fisierul 2=continutul din folderul 2 etc. Am incercat si for /d %%D in (*) do dir /s /b /a-d "%%D" >"%%D\%%D.txt"De data asta fecare fisier text plasat in folderele 1,2,3 imi listeaza doar structura folderului in care se afla. Problema e ca contine si path-ul, pe care trebuie sa-l sterg manual. Deci ori trebuie modificat primul script ca fiecare fisier sa listeze doar continutul folderului in care se afla, ori modificat cel de-al doilea ca sa listeze structura folderelor fara path. Am incercat apoi sa refac ierarhia folderelor for /F "delims=" %%L in ("Mindfulness in Eight Weeks.txt") do (mkdir "%%~pL" && move "%%~nxL" "%%~pL")Anterior n-a mers pentru ca am folosit % in loc de %%. Nici acum nu merge daca nu schimb numele cu ceva fara spatii gen "lista". Am schimbat numele fisierului si am modificat in script asa for /F "delims=" %%L in (lista.txt) do (mkdir "%%~pL" && move "%%~nxL" "%%~pL") A creat folderul, subfolderele, insa a mutat doar primul fisier din fiecare subfolder. In cazul de fata a mutat fisierul epub in subfolderul AudioBook si clipul nr 1 in subfolderul Practice. Deci si aici trebuie schimbat ceva ca sa mute toate fisierele. Am nevoie ca scriptul sa citeasca default fisierele text fara sa mai scriu eu numele fiecaruia, ceva de genul for /F "delims=" %%L in (*.txt) do (mkdir "%%~pL" && move "%%~nxL" "%%~pL")numai ca nu merge. @sags Fisierele sunt uploadate in cloud in ordinea in care sunt in PC, doar cand le descarc se amesteca. Daca 2 fisiere au acelasi nume, al doilea va fi numerotat cu 2 in coada. @afh Acum am vazut postarea ta si nu am apucat sa testez, dar observ ca s-a inlocuit automat cu "warez_spam" si nu inteleg ce era scris initial. Edited by entry, 18 November 2021 - 16:24. |
#18
Posted 18 November 2021 - 16:25
@afk: Mie imi merge combinatia de forfiles cu autoapelare *.bat:
@echo off if !%1! == !pasul2! goto :pasul2 forfiles /C "cmd /c if @isdir==TRUE call %0 pasul2 @path" goto :sfarsit :pasul2 shift echo Acum trateaza directorul %1.. goto :sfarsit :sfarsit (Si vezi ca ai niste ‘warez_spam’ prin cod, probabil puse de forum din motive care imi scapa…) |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users