Zastanawiałem się, czy ktoś wie, jak rekursywnie zmieniać znaczniki czasu folderów na podstawie najnowszego znacznika czasu znalezionego w plikach w tym folderze.
Na przykład:
jon @ UbuntuPanther: / media / media / MP3 / Foo Fighters / (1997-05-20) Kolor i kształt $ ls -alF 55220 ogółem drwxr-xr-x 2 jon jon 4096 30.08.2010 12:34 ./ drwxr-xr-x 11 jon jon 4096 30.08.2010 12:34 ../ -rw-r - r-- 1 jon jon 1694044 18.04.2010 2010 00:51 Foo Fighters - Doll.mp3 -rw-r - r-- 1 jon jon 3151170 18.04.2010 00:51 Foo Fighters - Enough Space.mp3 -rw-r - r-- 1 jon jon 5004289 18.04.2010 00:52 Foo Fighters - Everlong.mp3 -rw-r - r-- 1 jon jon 5803125 18.04.2010 00:51 Foo Fighters - February Stars.mp3 -rw-r - r-- 1 jon jon 4994903 18.04.2010 00:51 Foo Fighters - Hej, Johnny Park! .mp3 -rw-r - r-- 1 jon jon 4649556 18.04.2010 2010 00:52 Foo Fighters - Monkey Wrench.mp3 -rw-r - r-- 1 jon jon 5216923 18.04.2010 00:51 Foo Fighters - My Hero.mp3 -rw-r - r-- 1 jon jon 4294291 18.04.2010 00:52 Foo Fighters - My Poor Brain.mp3 -rw-r - r-- 1 jon jon 6778011 18.04.2010 2010 00:52 Foo Fighters - New Way Home.mp3 -rw-r - r-- 1 jon jon 2956287 18.04.2010 00:51 Foo Fighters - See You.mp3 -rw-r - r-- 1 jon jon 2730072 18.04.2010 2010 00:51 Foo Fighters - Up in Arms.mp3 -rw-r - r-- 1 jon jon 6086821 18.04.2010 00:51 Foo Fighters - Walking After You.mp3 -rw-r - r-- 1 jon jon 3033660 18.04.2010 00:52 Foo Fighters - Wind Up.mp3
Folder „(1997-05-20) Kolor i kształt” miałby swój znacznik czasu ustawiony na 2010-04-18 00:52.
źródło
/media/media/MP3s
? Następnie w zsh:for d in /media/media/MP3s/**/*(/); do touch -r $d/*(Dom[1]) $d; done
. Bez zsh (ale tak naprawdę użyj zsh, to jest po prostu prostsze): umieść polecenie w skrypcie i uruchomfind /media/media/MP3s -type d -execdir /path/to/the/script \;
.for d in ...
jaki sposób możesz dostosować następujące elementy, aby działało to również z folderami zawierającymi spacje? (którego wciąż brakuje w moim rozwiązaniu)To nie jest „rekurencyjnie”, po prostu zmienia wszystkie znaczniki czasu w folderze. Jeśli to masz na myśli, są dwa kroki.
stat -c '%Y' filename
wyświetli znacznik czasufilename
istat -c '%Y %n' *
wyświetli znacznik czasu i nazwę pliku każdego pliku w folderze, dzięki czemu znajdzie nazwę ostatnio zmodyfikowanego pliku w bieżącym folderze:Z drugiej strony istnieje znacznie łatwiejszy sposób na uzyskanie najwyższego znacznika czasu w folderze:
Następnie chcesz zmienić wszystkie pliki w folderze, aby miały ten sam znacznik czasu co ten plik.
touch -r foo bar
zmieni się tak,bar
aby mieć taki sam zmodyfikowany znacznik czasu jakfoo
, więc spowoduje to zmianę wszystkich plików w folderze na taki sam zmodyfikowany znacznik czasu, jak ostatnio zmodyfikowany plik:Tak więc jedna linijka to:
źródło
ls
nazwy plików mangles zawierające znaki spoza ASCII. Jeśli chcesz mieć jedno-linijki, użyj zsh :-)Złożyłem pracę i teraz:
Byłby to skrypt, który zmienia wszystkie katalogi wewnątrz
/tmp/test/
na znacznik czasu najnowszego pliku w każdym katalogu:możesz dodać kilka plików testowych w / tmp w następujący sposób:
źródło
"
ponownie usuwa , najpierw wygląda, jakby go brakowało, ale działa.po prostu użyj
źródło
Używam tego skryptu, aby rekurencyjnie ustawiać znaczniki czasu folderów na najnowszą zawartość. (Jest to bardzo podobne do odpowiedzi Gillesa):
źródło
Wziąłem komendę @Gilles zsh i ulepszyłem ją do pracy w podfolderach, ale wygląda na to, że zsh jest strasznie nieefektywny dla części ** / * (FDod).
Cytaty umożliwiają prawidłowe działanie pozycji katalogu zawierających spacje i tabulatory. FD sprawia, że wyszukuje niepuste katalogi, w tym te zaczynające się od., Od od przeszukuje w pierwszej kolejności , aby znaczniki czasu folderów nadrzędnych były odpowiednio aktualizowane.
Podczas testowania zauważyłem, że wydajność i wielkość pamięci dla ** / * (FDod) była szalona (ponad 1,4 GB dla zaledwie 650 tys. Folderów) i przeczytał całą część, zanim zaczął dotykać folderów. Po zastąpieniu go funkcją znajdź / odczyt stał się znacznie szybszy, nie spalił pamięci i zaczął działać niemal natychmiast.
Jeśli nie uruchamiasz go w skrypcie, zamień „$ @” na foldery, z których chcesz go uruchomić.
źródło
Naprawdę nie podobało mi się niejasność poleceń powłoki i szybko zrobiłem to w Pythonie.
Rekurencyjnie ustawia wszystkie mtimes katalogu na najnowszy niewykluczony plik / dir mtime wewnątrz.
źródło