BAT eller annat script för att söka efter filer med viss ändelse inuti ZIP eller RAR.

Permalänk

BAT eller annat script för att söka efter filer med viss ändelse inuti ZIP eller RAR.

Jag behöver hjälp med ett script som söker igenom ZIP / RAR filer efter filer med viss ändelse (.OBJ).
För varje sådan fil som hittas behöver jag skapa en dummyfil med exakt samma namn, fast 0 i filstorlek och i samma mapp som ZIP / RAR filen.

Dessa filer kommer kunna fungera som placeholders för att program som endast bryr sig om filändelsen.

Någon ledtråd?

Permalänk

@Haider of Sweden:

Tjena,

Slängde ihop något lite snabbt. (Python 3) Den kör endast mot 1 mapp, dvs den fortsätter inte in i andra mappar. Vill du att den ska fortsätta kan jag nog bygga på det när jag vaknar igen

https://pastebin.com/4cfx3tMs

Du behöver köra pip install rarfile först sen uppdatera filePathToZips i koden

Input:

Output:

EDIT:

Skulle du inte vilja ha filändelsen (.OBJ) i dummyfilerna så ändra rad 22 från
completePath = join(filePathToZips, fileName)
till
completePath = join(filePathToZips, fileName[:-4])

Permalänk

Grymt, tycker alltid att programmerare har super-powers!

Vi tar ett steg tillbaka. Jag laddar ner python från python.org och sedan är det bara o köra PIP-kommandot?

Kan du göra scriptet smart så att man kan lägga till parametrar, tex
- sök efter fler filändelse. (Skulle vilja hitta fler filändelser, tex .MAX och .VRMESH)
- ange sökväg (istället för att hårdkoda den)
- parameter för att söka i undermappar (i stil med /S eller -S)

tack än en gång!
Funderar på att förmå döttrarna o börja lära sig Python. Har förstått att det är ett bra instegsspråk. har ingen koll på hur utbrett och användbart det är.
Är själv grafiker och arkitekt och vet att man kan använda Python till 3dsMax och Revit (vi kan PM:as om det låter spännande med det, så kan vi utbyta idéer, programmerare och grafiker)
Java var väl inne ett tag, tack vare multiplattform. Har Python tagit över denna roll?

Permalänk
Skrivet av Haider of Sweden:

Grymt, tycker alltid att programmerare har super-powers!

Vi tar ett steg tillbaka. Jag laddar ner python från python.org och sedan är det bara o köra PIP-kommandot?

Kan du göra scriptet smart så att man kan lägga till parametrar, tex
- sök efter fler filändelse. (Skulle vilja hitta fler filändelser, tex .MAX och .VRMESH)
- ange sökväg (istället för att hårdkoda den)
- parameter för att söka i undermappar (i stil med /S eller -S)

tack än en gång!
Funderar på att förmå döttrarna o börja lära sig Python. Har förstått att det är ett bra instegsspråk. har ingen koll på hur utbrett och användbart det är.
Är själv grafiker och arkitekt och vet att man kan använda Python till 3dsMax och Revit (vi kan PM:as om det låter spännande med det, så kan vi utbyta idéer, programmerare och grafiker)
Java var väl inne ett tag, tack vare multiplattform. Har Python tagit över denna roll?

Precis, ladda ner python därifrån. sen kör "pip install rarfile" från kommandotolken!

Den uppdaterade versionen finns här - https://pastebin.com/3aa8JnBD
Jag har döpt python filen till script.py, men det är såklart valfritt!

Därefter kör du nedan kommandon!
python script.py --path C:\Users\OscarAndersson\Desktop\script

Vill du att den ska gå vidare i mappar som finns här inne kan du lägga till --diveMap så att kommandot blir som nedan
python script.py --path C:\Users\OscarAndersson\Desktop\script --diveMap

Vill du uppdatera filändelsen från .OBJ (har satt det som default just nu) så lägger du till --ext .nytt då blir kommandot som nedan
python script.py --path C:\Users\OscarAndersson\Desktop\script --ext .nytt

Vill du köra alla paramterar samtidigt kör du nedan
python script.py --path C:\Users\OscarAndersson\Desktop\script --diveMap --ext .nytt

Skulle säga att python är ett mycket bra instegsspråk! Det var ett av dem första språken jag lärde mig!
Är tyvärr ointresserad av grafik och dylikt, så måste tyvärr tacka nej här!
Men behöver du hjälp med något annat så är det bara att ropa till Skoj med sånthär!

Permalänk

Tack!

Finns stöd för fler ändelser i samma sökning? --ext .obj .3ds ?
Finns stöd för undermappar som en parameter?

Skickades från m.sweclockers.com

Permalänk
Skrivet av Haider of Sweden:

Tack!

Finns stöd för fler ändelser i samma sökning? --ext .obj .3ds ?
Finns stöd för undermappar som en parameter?

Skickades från m.sweclockers.com

https://pastebin.com/k9NwEPFa

--ext .txt .obj

Nu kan man skicka in flera filändelser

Förstår inte riktigt vad du menar med undermappar? Tänker du att du inte skickar in --diveMap utan istället skickar med
--path D:\test D:\test\mappett
Så att den söker igenom båda nedan?
D:\test
D:\test\mappett

Så att du manuellt specificerar vilka mappar den ska söka i?

Permalänk

Sorry, mitt fel! Jag läste "drive" och inte "dive", så detta kommando torde vara det jag söker efter.
Ska testköra inom kort och återkomma med en rapport

Permalänk

Här är resultatet:

C:\Script>dummy_asset_file.py --path "D:\3d Assets\30" --ext .obj .max Traceback (most recent call last): File "C:\Script\dummy_asset_file.py", line 43, in <module> main() File "C:\Script\dummy_asset_file.py", line 33, in main checkFileEnding(item.filename, file) File "C:\Script\dummy_asset_file.py", line 16, in checkFileEnding open(completePath, "x") FileNotFoundError: [Errno 2] No such file or directory: 'D:\\3d Assets\\30\\Scene_001/001_Proxy.max'

Rar-filen visar sig ha en egen mappstruktur och antingen bråkar scriptet med vilken typ av slash (\\ eller /), eller om det är just mappstruktur inne i de packade filerna.

Permalänk
Skrivet av Haider of Sweden:

Här är resultatet:

C:\Script>dummy_asset_file.py --path "D:\3d Assets\30" --ext .obj .max Traceback (most recent call last): File "C:\Script\dummy_asset_file.py", line 43, in <module> main() File "C:\Script\dummy_asset_file.py", line 33, in main checkFileEnding(item.filename, file) File "C:\Script\dummy_asset_file.py", line 16, in checkFileEnding open(completePath, "x") FileNotFoundError: [Errno 2] No such file or directory: 'D:\\3d Assets\\30\\Scene_001/001_Proxy.max'

Rar-filen visar sig ha en egen mappstruktur och antingen bråkar scriptet med vilken typ av slash (\\ eller /), eller om det är just mappstruktur inne i de packade filerna.

Kan du skicka över ett exempel på .rar fil så att jag kan testa?

Permalänk
Skrivet av fragstealern:

Kan du skicka över ett exempel på .rar fil så att jag kan testa?

Vet inte hur man attachar en fil här på forumet, så här kommer en dropbox-länk
https://www.dropbox.com/s/9sw2wqkoi4b5sgn/model_50.rar?dl=0

det är en dummy fil med tomma mappar, men jag såg till att härma en tänkbar mappstruktur och hur filerna är spridda inuti.

Permalänk
Skrivet av Haider of Sweden:

Vet inte hur man attachar en fil här på forumet, så här kommer en dropbox-länk
https://www.dropbox.com/s/9sw2wqkoi4b5sgn/model_50.rar?dl=0

det är en dummy fil med tomma mappar, men jag såg till att härma en tänkbar mappstruktur och hur filerna är spridda inuti.

Problemet är att finns en mapp struktur inne i .rar filen.

Frågan som behöver besvaras för att lösa det är:

Vill du att dummy filen fortsatt ska sparas bredvid .rar filen? Eller vill du att scriptet ska skapa en ny map som heter "model_50" och därefter lägga filerna där?

Exempelvis om vi har denna mapstrukturen
/model_50.rar

Vill du då att scriptet ska lägga filerna såhär
/model_50.rar
/file1
/file2
/file3

Eller vill du att scriptet ska lägga filerna såhär:
/model_50.rar
/model_50/file1
/model_50/file2
/model_50/file3

Med tanke på ditt första inlägg (Där du säger "i samma mapp som ZIP / RAR filen.") antar jag att du vill ha det bredvid .rar filen?

Om du vill ha det i samma map som .rar filen alltid så ska detta fungera: https://pastebin.com/bKTSncdn

Permalänk

Snyggt @fragstealern!
Du gjorde en helt korrekt tolkning att lägga dummyfilerna bredvid .RAR filen.
En återskapad mappstruktur går emot nyttan med detta program; att med dummyfiler visualisera .RAR filens innehåll utan att behöva gå in i den. En mappstruktur skulle tvinga en att behöva gräva runt efter filerna och då kan man ju lika gärna gå in i .RAR-filen.
Det kan mycket väl vara att andra användare skulle vilja återskapa mappstrukturen, men här och nu tycker jag att din lösning fungerar mycket bra!

Fråga: när jag kör med parametern -h för att få fram hjälpen säger den tex --diveMap [DIVEMAP]. Vad syftar [DIVEMAP] till? Är det ett annat sätt att köra parametern, alltså antingen --diveMap eller [DIVEMAP], eller något annat?

Bugg: när jag kör utan --ext så fångar den upp mappar som slutar med ordet "obj", alltså inte bara filer som heter .obj. Kör jag däremot --ext .OBJ så blir det rätt och mapparna ignoreras.

Önskemål: kan du lägga till ytterligare en parameter till --ext som gör att man blir tillfrågad "Please enter extension(s): ". Du kan välja parameterbenämningen själv, men jag menar alltså något i stil med --ext Q.
Jag sitter nämligen och snickrar på en context-menu till Windows explorer (för att slippa gå genom kommandotolken) med två val:
Make Dummy Asset-file(s)
Make Dummy Asset-file(s) - subdir

Jag funderar då att skapa undermenyer till respektive context-meny med förvalda ändelser samt "custom" som kör just den nyckeln som frågar användaren om extensions.

Permalänk
Skrivet av Haider of Sweden:

Snyggt @fragstealern!
Du gjorde en helt korrekt tolkning att lägga dummyfilerna bredvid .RAR filen.
En återskapad mappstruktur går emot nyttan med detta program; att med dummyfiler visualisera .RAR filens innehåll utan att behöva gå in i den. En mappstruktur skulle tvinga en att behöva gräva runt efter filerna och då kan man ju lika gärna gå in i .RAR-filen.
Det kan mycket väl vara att andra användare skulle vilja återskapa mappstrukturen, men här och nu tycker jag att din lösning fungerar mycket bra!

Fråga: när jag kör med parametern -h för att få fram hjälpen säger den tex --diveMap [DIVEMAP]. Vad syftar [DIVEMAP] till? Är det ett annat sätt att köra parametern, alltså antingen --diveMap eller [DIVEMAP], eller något annat?

Bugg: när jag kör utan --ext så fångar den upp mappar som slutar med ordet "obj", alltså inte bara filer som heter .obj. Kör jag däremot --ext .OBJ så blir det rätt och mapparna ignoreras.

Önskemål: kan du lägga till ytterligare en parameter till --ext som gör att man blir tillfrågad "Please enter extension(s): ". Du kan välja parameterbenämningen själv, men jag menar alltså något i stil med --ext Q.
Jag sitter nämligen och snickrar på en context-menu till Windows explorer (för att slippa gå genom kommandotolken) med två val:
Make Dummy Asset-file(s)
Make Dummy Asset-file(s) - subdir

Jag funderar då att skapa undermenyer till respektive context-meny med förvalda ändelser samt "custom" som kör just den nyckeln som frågar användaren om extensions.

Hade missat att uppdatera default input på --ext, bra fångat!

kör du --ext Q så blir du nu tillfrågad vilka extensions du vill söka efter - Separera dessa med ett mellanrum

python script.py --path D:\test --ext Q
Please enter extension(s): .jpg .max

Inte helt 100 på varför den skriver ut [diveMAP] men det fungerar inte att använda som input åtminstone. (Finns att läsa mer här vid intresse https://docs.python.org/3.3/library/argparse.html )

Uppdaterad version: https://pastebin.com/8vcMryip

Permalänk
Skrivet av fragstealern:

Hade missat att uppdatera default input på --ext, bra fångat!

så allt som behövdes var hakparantes för att få det att funka ['.obj']

Skrivet av fragstealern:

kör du --ext Q så blir du nu tillfrågad vilka extensions du vill söka efter - Separera dessa med ett mellanrum

Fick det inte att funka.
Körde DummyAssetFiles.py --path "C:\Users\Haider\Desktop\Sample" --ext Q och angav sedan .MAX som extension, inget hände.
När jag körde DummyAssetFiles.py --path "C:\Users\Haider\Desktop\Sample" --ext .MAX så funkade det

Skrivet av fragstealern:

Inte helt 100 på varför den skriver ut [diveMAP] men det fungerar inte att använda som input åtminstone.

Jag kunde inte på kort tid förstå förklaringen i länken du gav, men jag såg ett mönster.
I deras exempel stod det
usage: prog.py [-h] [--sum] N [N ...]

och i din kod:
usage: DummyAssetFiles.py [-h] [--ext [EXTENSION [EXTENSION ...]]] --path PATH [--diveMap [DIVEMAP]]

Det verkar ha något med "positional arguments" att göra. Får du inte till det är det inte hela världen, bara en estetisk grej som kan vara förvirrande för den som inte känner till scriptet.

Jag blev än en gång inspirerad av ditt arbete och kom på en (sista?) parameter som kan vara användbar: --out
Den kan användas --out .\OBJ eller --out OBJ så lägger den filerna i mappen .\OBJ

Permalänk

@Haider of Sweden:

https://pastebin.com/30b8FEiq

--outPath "C:\Users\OscarAndersson\Desktop\abc\out"

Permalänk
Medlem

Vill bara inflika med en eloge till @fragstealern, dels för hur hjälpsam du är genom att lösa problemt samt förklara hur den fungerar och används, samt att du delar lösningen fritt på forumet så att andra medlemmar kan använda/lära sig av koden du skriver. Förutom intresset för hårdvara var det denna typen av samarbete som fick mig att bli medlem i detta forum för bra många år sedan

Visa signatur

Stationär Threadripper 1950X / RX580 8GB / Corsair 32GB@3000mhz
Laptop MacBook Pro 13" early 2015
Kringutrustning Dell U3415W / Acer XB271HU / Sennheiser HD6xx / Kinesis Advantage / CST Trackball

https://datamaskin.se/

Permalänk

Ja, verkligen! Är väldigt tacksam för det fantastiska och generösa arbete av @fragstealern

tack för uppdateringen.
Om jag vill köra output till samma mapp, skulle man kunna göra så här:
args.outPath = args.path + args.outPath + '\\'

Detta skulle innebära att man kunde köra --outPath Foldername - tänker jag rätt?

Testade under tiden o göra en EXE-fil. Följde en guide där jag skulle använda pyinstaller. Har även en fin ikon till

Men filen blir rätt stor - 8,5Mb!
Vad gör jag för fel?

Permalänk
Skrivet av Haider of Sweden:

Ja, verkligen! Är väldigt tacksam för det fantastiska och generösa arbete av @fragstealern

tack för uppdateringen.
Om jag vill köra output till samma mapp, skulle man kunna göra så här:
args.outPath = args.path + args.outPath + '\\'

Detta skulle innebära att man kunde köra --outPath Foldername - tänker jag rätt?

Testade under tiden o göra en EXE-fil. Följde en guide där jag skulle använda pyinstaller. Har även en fin ikon till

Men filen blir rätt stor - 8,5Mb!
Vad gör jag för fel?

Tack för de fina orden, båda två

Hur tänker du med output till samma mapp? Tänker du så som den fungerade innan?

--outPath är inte ett måste att använda (Kanske jag skulle nämnt ). Så använder du inte --outPath så fungerar det som tidigare!

Har aldrig testat att göra om ett python script till en .exe fil men, i python ligger där mycket saker i bakgrunden, exempelvis "rarfile, zipfile" osv som vi importerar i scriptet. Dessa måste byggas in i .exe filen därav blir den mycket större.

Men har somsagt inte testat köra en .exe fil av det tidigare, men det borde vara detta som orsakar det!

Permalänk

Med output menade jag undermapp i relation till rar-filen. Så slipper man köra en jättelång sökväg igen.

Exe: det är nog precis som att säger.
Ska ändå undersöka ifall man kan optimera mer, mer av principsak än platsbrist