Automator :: Usuń 6-cyfrową datę z nazwy pliku; dołącz aktualną datę

3

Z góry przepraszam, jeśli udzielono na nie odpowiedzi, ale przeprowadziłem długie wyszukiwanie w nadziei na rozwiązanie.

Mam działającą aplikację Automator, która dołącza bieżącą sześciocyfrową datę (RRRMDD) na końcu nazwy pliku:

  • Dane wejściowe: nazwa_pliku.txt
  • Dane wyjściowe: nazwa_pliku_181212.txt

Bieżące polecenie bash:

today=$(date +%y%m%d)
for f in "$@"
do
    basename=${f##*/}
    filename=${basename%.*}
    path=${f%/*}
    ext=${f##*.}
    newfilename="$filename"_"$today"
    mv "$f" "$path"/"$newfilename"."$ext"
done

Jest to świetne, ale po regularnym używaniu zdałem sobie sprawę, że fajnie byłoby nie tylko dołączyć aktualną datę, ale najpierw sprawdzić, czy data jest już dołączona do nazwy pliku; jeśli tak, usuń go i dołącz aktualną datę, w przeciwnym razie po prostu dołącz aktualną datę.

Istnieją dwa scenariusze:

  1. Nazwa pliku zawiera dowolną datę (poprzednią / bieżącą / przyszłą) w 6-cyfrowym formacie opisanym poprzednio poprzedzonym znakiem podkreślenia (Nazwa pliku_181212.txt)
  2. Nazwa pliku nie zawiera dołączonego do niego 6-cyfrowego formatu daty (Filename.txt)

Zdaję sobie sprawę, że rozwiązanie, na które mam nadzieję, usunie wszelkie sześć cyfr i poprzedzające je „_”, jeśli istnieje, niezależnie od tego, czy jest to data, czy nie.

Czy jest możliwe, aby poprzedzić moje obecne polecenie bash czymś w rodzaju:

jeśli jakakolwiek kombinacja liczb istnieje bezpośrednio przed rozszerzeniem pliku („.ext”) ORAZ zawiera dokładnie 6 cyfr ORAZ jest poprzedzona znakiem podkreślenia („_”)

następnie usuń podkreślenie plus 6 cyfr ORAZ uruchom polecenie bash wymienione powyżej

jeśli nie, uruchom powyższą komendę bash

Podsumowanie Próbuję złagodzić ręczne usuwanie dat, które mogą istnieć w nazwie pliku, przed dołączeniem do nich bieżącej daty. Niektóre pliki mogą mieć daty, a inne nie.

Jeremy W.
źródło
Tak, ale wydaje się, że w tym przypadku polecenie daty jest nieistotne, ponieważ trzeba znaleźć tylko 6 cyfr (plus poprzedni znak podkreślenia), niezależnie od tego, czy jest to data przeszła, poprzednia czy przyszła.
Jeremy W,
przepraszam, usunąłem mój komentarz, wiedząc, że jest głupi.
Ruskes,
Data w nazwie pliku nie jest datą, tylko zwykły tekst (liczby), ale widzimy ją jako datę. Więc jeśli usuniesz wszystkie liczby w nazwie pliku, czy to zadziała?
Ruskes,
Myślę, że tak, ale „_” również będzie musiało zostać usunięte, ponieważ zostanie ono dodane po dodaniu bieżącej daty. Przypominamy, że jeśli data nie istnieje, nic nie jest usuwane; jest po prostu przekazywany do polecenia, które dołącza datę (którą aktualnie mam).
Jeremy W,
jest to dość chirurgiczny proces, o który prosisz. Po prostu usunięcie nazwy pliku i zastąpienie go datą nie jest opcją dla Ciebie.
Ruskes,

Odpowiedzi:

2

Powinno to zrobić tak, jak prosiłeś:

#!/bin/bash

today=$(date +%y%m%d)

for f in "$@"; do

    filebasename=${f##*/}
    filename=${filebasename%.*}
    path=${f%/*}
    ext=${f##*.}

    if [[ "$filename" =~ ^.*_[0-9]{6}$ ]]; then

        filename="$(sed -E -e 's/_[0-9]{6}$//'<<<"$filename")"

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"   

    else    

        newfilename="$filename"_"$today"
        mv "$f" "$path"/"$newfilename"."$ext"

    fi

done

Zauważ, że gdy używany w Run Shell Script działania w Automator workflow , może trzeba dodać pełną ścieżkę do sedw kodzie przewidzianym, np:/usr/bin/sed

użytkownik3439894
źródło
W porządku. Dla jasności, jeśli zmienię zmienną „basename” (i jej odwołanie w zmiennej „filename”) na coś takiego jak „filebasename”, to nie powinno być konfliktu, jeśli zostanie użyty bezpośrednio w terminalu lub linii poleceń?
Jeremy W
@Jeremy W, Tak, zmiana na inną niż istniejącą nazwę polecenia jest dobra rzeczą, 'filebasename' jest w porządku lub cokolwiek innego niż dokładnie „baesname” w tym przypadku użycia. Zostawiłem go tak, jak go pierwotnie napisałeś, abyś mógł łatwiej zobaczyć, jaki kod dodałem do twojego istniejącego kodu. Zaktualizuję to w mojej odpowiedzi teraz, gdy wiem, że jesteś tego świadomy. Zobacz także zaktualizowaną notatkę.
user3439894,