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"