Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cu ce va aparati de cainii agresi...

Nu imi platiti coletul cu cardul ...

Mi-au disparut amigdalitele ?

Exista vreun plan de terorizare p...
 Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 

Batch script care sa refaca structura folderelor din fisiere txt

- - - - -
  • Please log in to reply
26 replies to this topic

#1
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
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
Argv

Argv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,503
  • Înscris: 25.10.2007
Batchul este destul de limitat. Iti recomand sa incerci in power shell sau si mai bine in python.

#3
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,951
  • Înscris: 24.04.2013
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.

#4
Argv

Argv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,503
  • Înscris: 25.10.2007
Sau VB script

#5
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,440
  • Înscris: 10.08.2005
https://grumpybear.w...es-in-a-folder/

Te ajuta?

#6
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,951
  • Înscris: 24.04.2013
@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 Posted Image.

#7
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,440
  • Înscris: 10.08.2005
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
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,951
  • Înscris: 24.04.2013
Stai sa vad daca inteleg bine:
  • Intr-un loc, undeva, ai o structura cu subdirectore si fisiere gata aranjate.
  • In alt loc, ai acele fisiere dar la gramada toate in acelasi director. (Cum de au ajuns asa din moment ce le aveai gata aranjate nu stiu, da’ nu e subiectul acestui topic.)
  • Tu vrei sa imparti fisierele acelea din gramada pentru a reproduce impartirea pe subdirectoare din locul ‘sursa’.
  • Se presupune ca nu ai cum sa transporti toate fisierele de la sursa la destinatie, ca altfel le-ai copia pur si simplu sau ai face un backup/restore si gata. Sa zicem ca in total sunt prea mari si deja ai copii facute dar fatalitatea face ca aceste copii sa fie gramada intr-un singur director.
Atunci eu as incerca ceva de genul (NEtestat):
  • In directorul ‘radacina surselor’: dir /s /b /a-d >X:\DEOPARTE\listafisiere.txt
  • Editeaza X:\DEOPARTE\listafisiere.txt pentru a sterge directorul ‘radacina structurii sursa’ (fiindca banuiesc ca vrei se le pui pe alt disc si/sau in alta ‘radacina’). De exemplu daca toata treaba luata ca referinta este in C:\POZE folosesti notepad ca sa inlocuiesti global C:\POZE\ cu sirul vid.
  • Sa presupunem ca fisierele se gasesc la gramada stocate in S:\GRAMADA, fara a fi impartite pe subdirectoare.
  • In directorul destinatie: for /F "delims=" %L in (X:\DEOPARTE\listafisiere.txt) do (mkdir "%~pL" && move "S:\GRAMADA\%~nxL" "%~pL")

Edited by sags, 17 November 2021 - 17:23.


#11
Argv

Argv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,503
  • Înscris: 25.10.2007
Ai putea sa explici pentru ce ai nevoie?

#12
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
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.txt

rulat 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
afh

afh

    Active Member

  • Grup: Members
  • Posts: 1,836
  • Înscris: 14.04.2005
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,951
  • Înscris: 24.04.2013

View Postentry, on 17 noiembrie 2021 - 21:00, said:

… Cu privire la solutile sugerate am incercat asa
dir /s /b /a-d >listafisiere.txt

rulat in directorul sursa, tot acolo a creat si fisierul, nu in folderul din director. …
Da, creeaza lista cu tot ce e in directorul curent si in subdirectoare. Trebuie sa il adaptezi si sa rulezi pentru fiecare director pentru care vrei lista separata. Poti folosi for /D … do … pentru a itera pe subdirectoarele radacinii ‘sursa’, si pasezi numele acelui director catre comanda dir de mai sus, iar iesirea cu >fisier sa fie in subdirectoorul pe care il prelucrezi. Cred ca ar fi ceva de genul

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.

View Postentry, 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.
Ai pus cumva acea comanda intr-un fisier *.bat, exact cum apare ea aici? Cu % singure exact ca aici? Ce am scris eu e bun direct in linia de comanda, dar intr-un fisier *.bat trebuie ca acele % sa fie dublate: %%. Acesta ar fi un motiv foarte bun sa nu iti functioneze.

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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,440
  • Înscris: 10.08.2005
daca sunt mp3-uri, vad mai simplu un comment in ID3 tags

#16
afh

afh

    Active Member

  • Grup: Members
  • Posts: 1,836
  • Înscris: 14.04.2005
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
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,951
  • Înscris: 24.04.2013
@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

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate