Daty utworzenia zmiany partii na podstawie nazw plików

4

Mam pliki o nazwach „12. 2017-04-11 063118.jpg” i „123. 2016-09-05 115236.jpg”. Liczba po lewej stronie „.” liczy się jak indeks od 1 do 1400.

Jak mogę ustawić datę i godzinę utworzenia zgodnie z tym, jak określono w nazwie pliku dla wszystkich 1400 plików, które mam w folderze. Wiem, że polecenie touch -t zmienia datę utworzenia, ale nie wiem, jak wyodrębnić informacje o dacie / godzinie z nazwy pliku i umieścić je w poleceniu, aby było to wykonywane automatycznie dla wszystkich plików.

Wiem z innego wątku, że poniższe powinny działać. ale nie wiem, jak dostosować konwersję tekstu, aby poprawnie zastosować się do mojej konwencji nazewnictwa plików.

for f in *; do
    t=$(echo $f | sed -E 's/([A-z]*-)|([ ,;])|(\..*)//g' | sed -E 's/(.*)(..)/\1.\2/')
    touch -t $t "$f"
done

Powyższy kod działa, jeśli moja konwencja nazewnictwa plików przypomina „clip-2014-01-31 18; 50; 15.mp4”, jednak mam inny format: „12. 2017-04-11 063118.jpg” i „123. 2016-09-05 115236.jpg”. Czy ktoś wie, jak dostosować sedpolecenie funkcji, aby przetworzyć konwersję do odpowiedniego formatu dla dotyku?

Brent
źródło

Odpowiedzi:

6

Rozbudowa parametru Bash będzie działać:

for f in *; do
    t="${f#* }"
    t="${t%%.*}"
    t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"
    touch -t $t "$f"
done
  • t="${f#* }"usuwa część przed (<pierwsza spacja)
  • t="${t%%.*}" zdejmuje część po .
  • t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}" formatuje zawartość zmiennej daty (t) dla dotyku, która wymaga następującego formatu: [[CC] RR] MMDDggmm [.SS].

I jako jedna linijka:

for f in *; do t="${f#* }"; t="${t%%.*}"; t="${t:0:4}${t:5:2}${t:8:2}${t:11:2}${t:13:2}.${t:15:2}"; touch -t $t "$f"; done
klanomath
źródło
bare *(Glob) pokaże każdy obiekt systemu plików w katalogu. Czy uważasz, że używanie *.jpgbyłoby lepszym wyborem?
fd0
@ fd0 Rozwiązanie będzie działać tylko dla podanego formatu something_without_spaces YYYY[.|-|:]MM[.|-|:]DD hhmmSS.someextension. Nie spowoduje to zmiany daty utworzenia, jeśli wymagany format CCYYMMDDggmm.SS jest nieprawidłowy (np. Zawiera litery lub brakuje kropki).
klanomath
3

Ponieważ zapytałeś, jak możesz ulepszyć to, co już masz, w pierwszym przypadku zmieniłeś grupy przechwytywania, sedaby dopasować nowy wzór, pozostawiając drugi bez zmian sed. Również podwójnie zacytuj $fw echo "$f" |.

Należy jednak pamiętać, że już wyeliminowane korzystanie z rurą i drugim wystąpieniu sed, | sed ...poprzez korzystanie z -eopcji, która dołącza poleceń edycyjnych na listę komend.

for f in *; do
    t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/\1.\2/')
    touch -t $t "$f"
done

Tutaj jest dostosowywany jako jedno-liniowy:

for f in *; do t=$(echo "$f" | sed -E -e 's/(.*\. )|([-])|([ ])|(\..*)//g' -e 's/(.*)(..)/\1.\2/'); touch -t $t "$f"; done

Oto objaśnienie grup przechwytywania w pierwszym sedpoleceniu edycji:

wprowadź opis zdjęcia tutaj

Co pozostawia cię, 20160905115236a gdy jest przetwarzane przez drugie sedpolecenie edycji, staje się, 201609051152.36gdy (.*)(..)dzieli je na dwie grupy przechwytywania, druga zawiera ostatnie dwa znaki, a pierwsza zawiera wszystko inne. .Zostaje umieszczony w części z powrotem na zmianę o odniesieniami /\1.\2/zarówno grupy wychwytujące.

użytkownik3439894
źródło
0

Jeśli pliki zawierają znaczniki wyjścia, bezpłatny „exiftool” może zmienić nazwę pliku zgodnie z wartościami w pliku. Zainstalowanie go powoduje również zainstalowanie szczegółowej strony podręcznika man.

http://www.sno.phy.queensu.ca/~phil/exiftool/

Użyłem tego narzędzia nie tylko do zmiany nazw plików, ale także do pisania fragmentów kodu HTML w celu pokazania plików na stronie internetowej.

WGroleau
źródło
OK, mój zły. Po ponownym przeczytaniu widzę, że chcesz zmienić daty pliku, a nie nazwę. Być może exiftool może to zrobić. Mój MAC nie działa, więc nie mogę odczytać strony podręcznika.
WGroleau,