Změna datumu adresáře dle souborů uvnitř
Dobrý den
Mám záznamy z kamer a nějak se mi změnily datumy vytvoření u složek. Potřeboval bych nějaký skript, bat soubor který by dle souborů uvnitř složky změnil datum adresáře v kterém je umístěn. V každém adresáři jsou soubory jen z toho dne. Mohl by mi někdo pomoci?
Premenuj celú zložku - ako dátum vyhotovenia záznamov. Dátum v zložke sa automaticky vytvorí pri vytvorení zložky.
Pokud by to mohlo být v powershellu, tak třeba nějak takhle:
Jako parametr se tomu zadává adresář, kterému to má změnit datum.
Záznamy se ukládají do složky HIKVISION - DS-2DE2A204IW-DE3 a v něm je v současné době 1867 adresářů pojmenovaných tímhle způsobem - 20230113PM (AM). V názvu složky je tedy datum.
Já potřebuji změnit všech těch 1867 adresářů.
Takže se nezměnil datum složek, ale jejich název? Trochu rozdíl, nemyslíš?
Ne ne to jsem uvedl jak se soubory ukládají. Já potřebuji přesně to co jsem psal, datum vytvoření adresáře dle souborů uvnitř.
A aby se změna provedla u všech těch tisíc adresářů.
Tohle změní datum vytvoření všech podadresářů (podle jejich prvního souboru) ve adresáři, kde to spustíš:
Ještě prosím jak to spustím
zadal jsem příkaz CD\\synologynas\Media\Skouska\ čímž jsem se dostal do adresáře a zkopíroval příkaz, vložil a nic. Powershell jsem spouštěl jako správce.
Co znamená "a nic"?
Vrátí mi to tento řetězec a nic to neudělá
PS C:\Users\Mirek> cd \\synologynas\Media\Skouska\
PS Microsoft.PowerShell.Core\FileSystem::\\synologynas\Media\Skouska> Get-ChildItem -Directory | ForEach-Object { $_.CreationTime = (Get-ChildItem -File $_)[0].CreationTime }
PS Microsoft.PowerShell.Core\FileSystem::\\synologynas\Media\Skouska>
Zkusil jsem to a datum to změnilo. Jsi si jistý, že chceš změnit datum vytvoření a ne třeba datum poslední změny?
I když jak teď koukám, tak k tomu přistupuješ přes síť a nejspíš i k jinému filesystému a tam to zaručit nedokážu. To jsi měl ovšem uvést už v původním dotazu.
Tak to se omluvám soubory mám na nasu, přesto děkuji za ochotu.
Mirek
Zkusil bych třeba jeden adresář stáhnout na lokální disk a poté ověřit funkčnost toho příkazu v power shellu....
Asi by šlo něčo spustit v shellu toho NASu, ale Powershell tam asi nebude.
Pokud tam bude linux a bash a další, na linuxu obvyklé věci, tak by mělo fungovat tohle:
find -type d |grep -v "^\.$"|sort -r|sed 's@\(.*\)@echo \1;touch --reference="\1/\`ls -1 \1|head -n 1\`" "\1"@'
s použitím ve stylu ( /home/gilhad/tmp/C je adresář, ve kterém jsou upravované adresáře)
a s vysvětlením
ls -al
vypiš v dlouhém formátu s časem
find -type d |grep -v "^\.$"|sort -r|sed 's@\(.*\)@echo \1;touch --reference="\1/\`ls -1 \1|head -n 1\`" "\1"@'
find -type d
najdi všechny podadresáře - jo, jede to rekurzivně celou podstrukturu, ale ty to stejně máš ploché, kdybys chtěl jen jednu úroveň, tak HNED za find přidej parametr -maxdepth 1
grep -v "^\.$"
vyhoď adresář "./"
sort -r
setříď dle abecedy, reverzně - čili podadresáře před rodiče, zpracování dle abecedy, nikoli náhodného pořadí, jak to leží v adresáři nesetříděné
sed 's@\(.*\)@echo \1;touch --reference="\1/\`ls -1 \1|head -n 1\`" "\1"@'
uprav seznam adresářů na seznam příkazů takto
s@
nahrazuj, jako oddělovač použijeme zavináč, abychom si neblokovali lomítko
\(.*\)
najdi cokoli a ber to jako první hodnotu (čili \1)
@
konec hledání, nahrazuj tímto
echo \1;
výpis, co děláme
touch --reference="\1/\`ls -1 \1|head -n 1\`" "\1"
nastav čas pro zpracovávaný adresář "\1"
--reference="\1/\`ls -1 \1|head -n 1\`"
podle souboru, který vypíše vložený shell - vše mezi `a` (oeskapovanýma \) - před to přidej adresář a lomítko \1/
ls -1 \1
vypiš soubory z adresáře po jednom na řádek
head -n 1
vypiš pouze první řádek
|sh
výstup přesměruj do shellu, který ho provede jako příkazy
ten výstup je jako
Zkopíroval jsem část adresáře na lokální disk a to samé, neudělalo to nic. Možná dělám něco blbě.
PS C:\Users\Mirek> cd e:\Skouska (dám enter)
PS E:\Skouska> Get-ChildItem -Directory | ForEach-Object { $_.CreationTime = (Get-ChildItem -File $_)[0].CreationTime } (vložím příkaz a dám enter)
PS E:\Skouska> (toto se vypíše a nic se nestane)
A jak víš, že se nic nestane? Ono to nic nevypisuje, prostě to jenom změní datumy.
Samozřejmě jsem v total comanderu kontroloval a je tam stále stejné datum. Ta velká sada příkazů (co jsi napsal )je pro mne moc složitá.
A koukáš opravdu na datum vytvoření? Protože TC zobrazuje datum poslední změny. Datum vytvoření zjistíš např. tak, že klikneš pravým a dáš vlastnosti.
Nevidím tu od Wikana velkou sadu příkazů, tak jestli je to na mě, tak je to jen jeden dlouhý řádek, který copy-paste (abys neudělal překlep) vrazíš tomu NASu, když na něm budeš přihlášený a ve správném adresáři
Pokud mi bezmezně věříš, tak není potřeba nic víc, pokud nejsi tak naivní, nebo se chceš něco naučit, nebo udělat jinak, tak jsem to i rozebral
Například můžeš chtít laborovat s parametry touch (-a -m), nebo find (-depth a vyhodit sort, -maxdepth cosi) nebo vyhodit zbytečné echo, nebo tak podobně a časem to nějak změnit celé a použít na cosi zcela jiného (jo, je tam použito několik šikovných principů)
proto jsem do toho svého příkladu pro Linux dal to echo - taky mám rád, když vidím, jestli se něco děje, nebo to někde zatuhlo, zvlášť pokud má jít o 1867 adresářů
(jako zase chápu, že mi to echo zpomaluje zpracování a odroluje obrazovku, takže u takovýchto jednorázovek jo, u něčeho, co spouštím furt a nejspíš i z cronu spíš ne)
Datum vytvoření mi to píše dnes kdy jsem to kopíroval
A sakra tak já potřebuji asi poslední úpravy. díval jsem se na originály na nasu a tam je datum vytvoření správný
Tak takhle:
To mi změnilo, ale na dnešní datum a ne dle souboru uvnitř
nemůže být problém se jménem souboru vypada takto Airlive - BU-3026-IVS-20221025-183957-1666715997532-7
A koukal ses na datumy těch souborů uvnítř? Nezměnily se ti tím kopírováním taky nějak?
Změní to datum posledního zápisu podle data vytvoření souboru. Takže to možná chceš taky podle posledního zápisu? V tom případě i to druhé změn na LastWriteTime.
Už jsem to zkusil a funguje, díky moc za trpělivost.
Mirek