Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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?

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Záznamy se ukládají do složky HIKVISION - DS-2DE2A204IW-DE3 a v něm je v současné době 1867 adresářů… nový
damirek 13.01.2023 12:32
damirek
Takže se nezměnil datum složek, ale jejich název? Trochu rozdíl, nemyslíš? nový
Wikan 13.01.2023 12:38
Wikan
Ne ne to jsem uvedl jak se soubory ukládají. Já potřebuji přesně to co jsem psal, datum vytvoření ad… nový
damirek 13.01.2023 15:50
damirek
Tohle změní datum vytvoření všech podadresářů (podle jejich prvního souboru) ve adresáři, kde to spu… nový
Wikan 13.01.2023 16:04
Wikan
Ještě prosím jak to spustím zadal jsem příkaz CD\\synologynas\Media\Skouska\ čímž jsem se dostal do… nový
damirek 14.01.2023 12:30
damirek
Co znamená "a nic"? nový
Wikan 14.01.2023 12:33
Wikan
Vrátí mi to tento řetězec a nic to neudělá PS C:\Users\Mirek> cd \\synologynas\Media\Skouska\ PS Mic… nový
damirek 14.01.2023 19:00
damirek
Zkusil jsem to a datum to změnilo. Jsi si jistý, že chceš změnit datum vytvoření a ne třeba datum po… nový
Wikan 14.01.2023 19:13
Wikan
Tak to se omluvám soubory mám na nasu, přesto děkuji za ochotu. Mirek nový
damirek 14.01.2023 20:27
damirek
Zkusil bych třeba jeden adresář stáhnout na lokální disk a poté ověřit funkčnost toho příkazu v powe… nový
host 14.01.2023 20:33
host
Asi by šlo něčo spustit v shellu toho NASu, ale Powershell tam asi nebude. nový
Wikan 14.01.2023 20:37
Wikan
Pokud tam bude linux a bash a další, na linuxu obvyklé věci, tak by mělo fungovat tohle: find -type… nový
gilhad 14.01.2023 21:39
gilhad
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… nový
damirek 14.01.2023 21:41
damirek
A jak víš, že se nic nestane? Ono to nic nevypisuje, prostě to jenom změní datumy. nový
Wikan 14.01.2023 21:46
Wikan
Samozřejmě jsem v total comanderu kontroloval a je tam stále stejné datum. Ta velká sada příkazů (co… nový
damirek 14.01.2023 21:50
damirek
A koukáš opravdu na datum vytvoření? Protože TC zobrazuje datum poslední změny. Datum vytvoření zjis… nový
Wikan 14.01.2023 21:58
Wikan
Nevidím tu od Wikana velkou sadu příkazů, tak jestli je to na mě, tak je to jen jeden dlouhý řádek,… nový
gilhad 14.01.2023 22:12
gilhad
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… nový
gilhad 14.01.2023 21:53
gilhad
Datum vytvoření mi to píše dnes kdy jsem to kopíroval A sakra tak já potřebuji asi poslední úpravy.… nový
damirek 14.01.2023 22:08
damirek
Tak takhle: Get-ChildItem -Directory | ForEach-Object { $_.LastWriteTime = (Get-ChildItem -File $_)… nový
Wikan 14.01.2023 22:16
Wikan
To mi změnilo, ale na dnešní datum a ne dle souboru uvnitř nemůže být problém se jménem souboru vypa… nový
damirek 14.01.2023 22:24
damirek
A koukal ses na datumy těch souborů uvnítř? Nezměnily se ti tím kopírováním taky nějak? nový
gilhad 14.01.2023 22:26
gilhad
Změní to datum posledního zápisu podle data vytvoření souboru. Takže to možná chceš taky podle posle… nový
Wikan 14.01.2023 22:26
Wikan
Už jsem to zkusil a funguje, díky moc za trpělivost. Mirek poslední
damirek 14.01.2023 22:31
damirek

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ářů.

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.

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)


[gilhad@cobra-mk3(7) ~] $ cd /home/gilhad/tmp/C
[gilhad@cobra-mk3(7) C] $ ls -al
total 24
drwxr-xr-x  6 gilhad users 4096 2023-01-14 20:41 .
drwxr-xr-x 17 gilhad users 4096 2023-01-14 20:41 ..
drwxr-xr-x  2 gilhad users 4096 2023-01-14 20:42 test1
drwxr-xr-x  2 gilhad users 4096 2023-01-14 20:42 test2
drwxr-xr-x  2 gilhad users 4096 2023-01-14 20:42 test3
drwxr-xr-x  2 gilhad users 4096 2023-01-14 20:43 test4
[gilhad@cobra-mk3(7) C] $ find -type d |grep -v "^\.$"|sort -r|sed 's@\(.*\)@echo \1;touch --reference="\1/\`ls -1 \1|head -n 1\`" "\1"@'|sh
./test4
./test3
./test2/test2.b
./test2/test2.a
./test2
./test1
[gilhad@cobra-mk3(7) C] $ ls -al
total 24
drwxr-xr-x  6 gilhad users 4096 2023-01-14 20:41 .
drwxr-xr-x 17 gilhad users 4096 2023-01-14 20:41 ..
drwxr-xr-x  2 gilhad users 4096 2017-04-05 12:35 test1
drwxr-xr-x  2 gilhad users 4096 2007-01-25 16:30 test2
drwxr-xr-x  2 gilhad users 4096 2022-06-04 13:07 test3
drwxr-xr-x  2 gilhad users 4096 2007-09-17 08:57 test4
[gilhad@cobra-mk3(7) C] $ 

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

echo ./test3;touch --reference="./test3/`ls -1 ./test3|head -n 1`" "./test3"

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)

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)

Zpět do poradny Odpovědět na původní otázku Nahoru