Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Problema cuptor electric cu disju...

Merita achizitionat DFSK Fengon 5...

Pret actual invelitoare

Probleme baterie Samsung A54
 Schema statie auto Renegade REN 1...

Magazine IT de incredere

Parere SKODA Octavia 3 2.0TDI 150CP

Achizitie telefon 1000-1200lei
 Unde gasesc o lampa buna pe gaz?

Consulta specialiștii... Und...

Fostul director al Frontex: Comis...

Construire anexa lipita de casa
 Ce folositi pentru urina mirosito...

Socializare in prezenta copiilor

Cont Samsung A32

Hotarare definitiva a instantei, ...
 

Batch script care sa refaca structura folderelor din fisiere txt

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

#19
afh

afh

    Active Member

  • Grup: Members
  • Posts: 1,832
  • Înscris: 14.04.2005

View Postentry, on 18 noiembrie 2021 - 16:22, said:

@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.
era "warez_spam_", dar nu contează, poţi să laşi şi cu "warez_spam" :)

#20
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,769
  • Înscris: 24.04.2013
for /d %D in (*) do (forfiles /P "%D" /S /C "cmd /c if @isdir==FALSE echo @relpath" >"%D.txt" && move /y "%D.txt" "%D")
Aici sunt facute 2 modificari:
  • forfiles primeste un argument /P director care ii spune ce director sa trateze. Implicit trateaza directorul curent, care in situatia data e ‘radacina tuturor’, si de aceea la fiecare iteratie listeaza fisierele din toate subdirectoarele.
  • Lista este creata in ‘radacina’ si mutata apoi in subdirector. Asa se evita ca numele fisierului cu lista sa apara in interiorul listei…
Ce tot nu imi place este ca apare o linie goala la inceputul listei, care aparent este scrisa automat de forfiles insusi (nu de comenzile executate), si poate ce deranjeaza ulterior. Mai observ ca toate liniile din lista incep cu .\, dar aceasta nu prea deranjeaza mai tarziu fiindca C:\LAGRAMADA\.\nume.ext este absolul acelasi lucru cu C:\LAGRAMADA\nume.ext.

View Postentry, on 18 noiembrie 2021 - 16:22, said:

… Nici acum nu merge daca nu schimb numele cu ceva fara spatii gen "lista". …
Foloseste for /F "usebackq; delims=" %L in ("lista cu spatii in nume.txt") do …. Fara usebackq ghilimele au o semnificatie speciala: ce este intre ele este textul insusi al unicei linii de prelucrat, si nu numele unui fisier pe ale carui linii trebuie sa itereze pentru a o prelucra pe fiecare in parte.

View Postentry, on 18 noiembrie 2021 - 16:22, said:

… 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. …
Daca in cloud e organizat pe directoare cum trebuie, atunci musai sa o rezolvi cu download-ul sa respecte aceasta structura. Orice altceva e chin inutil si oricum pierzi informatie. Daca la origine ai A\file.ext si B\file.ext atunci dupa download te trezesti cu C:\LAGRAMADA\file.ext si "C:\LAGRAMADA\file (2).ext". De unde sti unde sa pui file.ext? In A sau in B? Ca depinde de ordinea in care s-a facut download-ul. Si cum va sti script-ul ca "file (2).ext" a fost de fapt la origine tot un file.ext (si care din ele), ca acum numele e altul?

Ce cloud folosesti? Nu cumva suporta acces prin FTP sau WebDAV? Ca daca da atunci cu o selectie a subdirectoarelor pe care le vrei si drag’n’drop in File Explorer peste directorul local de destinatie faci download dintr-un foc la tot.

Edited by sags, 18 November 2021 - 17:36.


#21
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
@afh Nu stiu daca am procedat corect, dar asa am facut. Am un director Backup1, el are un folder "Mindfulness in 8 Weeks" pe care vreau sa-l urc in cloud. Acesta are 2 subfoldere, primul cu 2 fisiere, al doilea cu 5 fisiere.
Am creat scripturile makelist.bat si makelist2.bat si le-am plasat in directorul Backup1. Am rulat makelist.bat. A creat un fisier "Mindfulness" fara extensie in directorul Backup1. Continutul lui

.\Mindfulness in 8 Weeks\.\AudioBook\Mindfulness in Eight Weeks.epub in 8 Weeks\warez_spam_Mindfulness in 8 Weeks.txt
.\Mindfulness in 8 Weeks\.\AudioBook\Mindfulness in Eight Weeks.mp3 in 8 Weeks\warez_spam_Mindfulness in 8 Weeks.txt
.\Mindfulness in 8 Weeks\.\Practice\01. The Raisin Exercise.mp3 in 8 Weeks\warez_spam_Mindfulness in 8 Weeks.txt
.\Mindfulness in 8 Weeks\.\Practice\02. The Body Scan (Longer Version).mp3 in 8 Weeks\warez_spam_Mindfulness in 8 Weeks.txt
.\Mindfulness in 8 Weeks\.\Practice\03. The Body Scan (Shorter Version).mp3 in 8 Weeks\warez_spam_Mindfulness in 8 Weeks.txt
.\Mindfulness in 8 Weeks\.\Practice\04. Mindfulness of Breathing 10 mins.mp3 in 8 Weeks\warez_spam_Mindfulness in 8 Weeks.txt
.\Mindfulness in 8 Weeks\.\Practice\05. Mindfulness of Breathing 5 mins.mp3 in 8 Weeks\warez_spam_Mindfulness in 8 Weeks.txt

Eu as dori sa fie creat in folderul din Backup1, sa fie numit dupa acel folder si sa aiba extensia txt, ca sa fie urcat in cloud impreuna cu fisirele, e ca un fel de index al folderului.
Am luat acest fisier si l-am mutat in directorul Backup2. Tot acolo am mutat si fisierele extrase din foldere. Adica cum as face daca le-as descarca din cloud. Am creat scripturile movefiles.bat si movefiles2.bat si le-am plasat in directorul Backup2. Am rulat movefiles.bat. Din pacate folderele n-au fost create.

@sags Comanda asta
for /d %D in (*) do (forfiles /P "%D" /S /C "cmd /c if @isdir==FALSE echo @relpath" >"%D.txt" && move /y "%D.txt" "%D")
este foarte aproape de reusita. Daca o rulez in directorul Backup1 care contine folderul "Mindfulness in 8 Weeks" pune un fisier text in acel folder numit dupa acel folder si cu continutul acelui folder. Numai ca...cand incerc sa generez folderele cu
for /F "usebackq delims=" %%L in ("Mindfulness in 8 Weeks.txt") do (mkdir "%%~pL" && move "%%~nxL" "%%~pL")

creeaza numai numai cele 2 subfoldere nu si folderul mama, adica folderul "Mindfulness in 8 Weeks" nu este creat, ci numai subfolderele pe care le contine "Audibook" si "Practice".

Folosesc Telegram, ofera spatiu nelimitat de stocare, cu limita de max 2GB pe fisier. Din pacate nu se pot uploada si foldere. Am urcat putine fisiere cu nume duplicat, dar exista cateva, probabil pe viitor o sa le numesc diferit ca sa nu fie probleme.

Edited by entry, 18 November 2021 - 18:45.


#22
afh

afh

    Active Member

  • Grup: Members
  • Posts: 1,832
  • Înscris: 14.04.2005
în makelist2,treubuie să pui %~1\warez_spam_%~n1%.txt între ghilimele, pentru %~n1% este numele folderului tău, iar folderul tău are spaţii în el, deci trebuie să fie aşa

"%~1\warez_spam_%~n1%.txt"

LE:
uite un exemplu:
Am următoarea structură:

root_backup/
├─folder1_to_upload/
│ ├─subfolder/
│ │ └─file2.txt
│ └─file1.txt
├─folder2_to_upload/
│ ├─subfolder/
│ │ └─file4.txt
│ └─file3.txt
├─makelist2.bat
├─makelist.bat
├─movefiles2.bat
└─movefiles.bat

după ce rulez makelist.bat:

root_backup/
├─folder1_to_upload/
│ ├─subfolder/
│ │ └─file2.txt
│ ├─file1.txt
│ └─warez_spam_folder1_to_upload.txt
├─folder2_to_upload/
│ ├─subfolder/
│ │ └─file4.txt
│ ├─file3.txt
│ └─warez_spam_folder2_to_upload.txt
├─makelist2.bat
├─makelist.bat
├─movefiles2.bat
└─movefiles.bat


warez_spam_folder1_to_upload.txt are:
.\folder1_to_upload\.\file1.txt
.\folder1_to_upload\.\subfolder\file2.txt


warez_spam_folder2_to_upload.txt:
.\folder2_to_upload\.\file3.txt
.\folder2_to_upload\.\subfolder\file4.txt


Edited by afh, 18 November 2021 - 19:14.


#23
afh

afh

    Active Member

  • Grup: Members
  • Posts: 1,832
  • Înscris: 14.04.2005
invers, rulezi movefiles.bat când ai următoarea structură şi cu puţin noroc îţi reface structura :)

root_backup/
├─file1.txt
├─file2.txt
├─file3.txt
├─file4.txt
├─warez_spam_folder1_to_upload.txt
├─warez_spam_folder2_to_upload.txt
├─makelist2.bat
├─makelist.bat
├─movefiles2.bat
└─movefiles.bat



#24
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
makelist.bat
set run=%~dp0makelist2.bat
forfiles /C "cmd /c if @isdir==TRUE call %run% @path"

makelist2.bat
del /F "%~1\%~n1%.txt"
for /f "delims=" %%i in ('forfiles /P %1 /S /C "cmd /c if @isdir==FALSE echo @relpath"') do echo .\%~n1\%%~i>> "%~1\%~n1%.txt"

Acum functioneaza corect, creeaza un fisier text in folderul din root, il numeste dupa acel folder si il scrie cu structura acelui folder de forma

.\Mindfulness in 8 Weeks\.\AudioBook\Mindfulness in Eight Weeks.epub
.\Mindfulness in 8 Weeks\.\AudioBook\Mindfulness in Eight Weeks.mp3
.\Mindfulness in 8 Weeks\.\Practice\01. The Raisin Exercise.mp3
.\Mindfulness in 8 Weeks\.\Practice\02. The Body Scan (Longer Version).mp3
.\Mindfulness in 8 Weeks\.\Practice\03. The Body Scan (Shorter Version).mp3
.\Mindfulness in 8 Weeks\.\Practice\04. Mindfulness of Breathing 10 mins.mp3
.\Mindfulness in 8 Weeks\.\Practice\05. Mindfulness of Breathing 5 mins.mp3

Mut fisierul generat in alt folder, mut acolo si fisierele si cele 2 scripturi

movefiles
set run=%~dp0movefiles2.bat
forfiles /M *.txt /C "cmd /c if @isdir==FALSE call "%run%" @path"
forfiles /M *.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")

Cand rulez movefiles.bat nu genereaza folderele, ci doar imi sterge fisierul index cu structura folderelor. Dar suntem aproape...

Edited by entry, 18 November 2021 - 20:05.


#25
sags

sags

    Senior Member

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

View Postentry, on 18 noiembrie 2021 - 18:43, said:

… Folosesc Telegram, ofera spatiu nelimitat de stocare, cu limita de max 2GB pe fisier. Din pacate nu se pot uploada si foldere. …
Stai sa vad daca inteleg bine: tu de fapt te chinuiesti sa atasezi fisierele unor mesaje dintr-un chat, bazandu-te ca acele mesaje impreuna cu fisierele atasate ajung cumva stocate undeva in lume. Mi se pare a fi un ‘claud’ de un primitivism feroce. Printre primele rezultate la o cautare am dat peste <https://telegramguru...-cloud-storage/> care face apologia acestui claud si, sincer sa fiu, am ramas masca de cum reuseste cineva sa scrie atatea ineptii intr-o singura pagina…

Acu de dragu’ rezolvarii problemei propuse:

for /d %D in (*) do (forfiles /P "%D" /S /C "cmd /c if @isdir==FALSE echo 0x22%D0x22\@relpath" >"STRUCTURA-%D.txt" && move /y "STRUCTURA-%D.txt" "%D")
Executata in ‘radacina globala’ iti creeaza listele in fiecare subdirector de pe primul nivel. Am adaugat prefixul STRUCTURA- la aceste liste pentru a le putea recunoaste ulterior, ca ele sfarsesc amestecate printre fisierele de date (poze, cantecele, ce ai tu pe-acolo). Aici am scris din nou cu % nedublate, cum scrii direct in linia de comanda, daca chiar vrei sa pui comanda intr-un *.bat atunci le dublezi.

La restaurare pui la gramada toate fisierele si listele in noua ‘radacina globala’. Listele vor fi recunoscute dupa prefixul adaugat mai sus. Apoi in acest director executi:
for %s in (STRUCTURA-*.txt) do for /F "usebackq delims=" %L in ("%s") do (
	mkdir "%~pL"
	move "%~nxL" "%~pL"
)
Aceasta comanda parcurge toate listele, creeaza structurile de directoare si muta fisierele unde trebuie. Comanda trebuie scrisa asa cum e mai sus, cu paranteze si pe mai multe linii. Motivul pentru care inainte nu iti punea decat cate un singur fisier in fiecare subdirector este ca aveai doua comenzi concatenate cu && si incepand de la al doilea fisier comanda mkdir dadea eroare asa incat comanda move de dupa ea nu se mai executa. Puse pe linii separate se executa si a doua comanda chiar daca prima da eroare. (Nu uita de dublat % daca le scrii intr-un *,bat.)


In alta ordine de idei:
Nu ar fi mai bine daca ai impacheta tu subdirectoarele de pe primul nivel cate unul per *.zip? Asa ai avea toate fisierele aranjate, cu tot cu subdirectoare si cu tot cu subdirectorul de pe primul nivel. Dupa download, dai click dreapta pe zip si ‘Extract all…’, iti reface totul cum a fost.

Si nu ar fi si mai bine daca ai folosi tu un cloud ca lumea? Ai avea totul usor accesibil si organizat. In plus, ce te faci daca din neatentie stergi un mesaj sau un chat intreg? Nu cumva pierzi TOT ce era atasat acelui mesaj sau acelui chat?

Edited by sags, 18 November 2021 - 20:22.


#26
afh

afh

    Active Member

  • Grup: Members
  • Posts: 1,832
  • Înscris: 14.04.2005

Quote

Cand rulez movefiles.bat nu genereaza folderele, ci doar imi sterge fisierul index cu structura folderelor. Dar suntem aproape...
e din cauză că folderul tău are spaţiu în nume.
ca să vezi dacă e ceea ce vrei, schimbă in makelist2 "%~1\%~n1%.txt"  în "%~1\warez_spam_.txt" .
dacă merge, vezi şi tu cum faci să poţi să citeşti lista de fişiere dintr-un fişier text cu spaţiu în nume.
sincer, eu nu mă pricep, eram doar curios cum s-ar face, dar spaţiile astea în calea fişierelor sunt un adevărat chin în batch.

pentru chestii din astea simple cred că cel mai simplu e să faci scripturi în autoit - https://www.autoitscript.com/site/
nu cred că există ceva mai uşor decât autoit

Edited by afh, 18 November 2021 - 21:53.


#27
entry

entry

    Member

  • Grup: Members
  • Posts: 627
  • Înscris: 19.11.2015
@afh si @sags Mii de multumiri pentru ajutor. Intr-adevar ultimele solutii propuse de @sags functioneaza fara cusur atat la indexarea folderelor cat si la refacerea lor. Fara ajutorul vostru nu as fi putut gasi aceste solutii. Pentru mine sunt ca o limba straina Posted Image

Referitor la Telegram @sags ai perfecta dreptate, e chiar primitiv, dar e free Posted Image. Arhivarea fisierelor e utila pentru cold storage, fisiere pe care nu le folosesc des, dar cele video le urc asa ca pot face streaming, nu mai trebuie sa le descarc mereu.

Mai am fisiere si prin Google Drive, dar tot free, niste conturi edu care vor fi limitate de anul viitor si acum le transfer in Telegram. Multam mult, sunteti foarte priceputi!

Edited by entry, 18 November 2021 - 21:57.


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