/ / Zmień nazwy plików, zmieniając porządek w bashu - bash, zmień nazwę

Zmień nazwy plików, zmieniając wzór w bash - bash, zmień nazwę

Mam pliki pdf w formacie:

Author-YYYY-rest_of_text_seperated_by_underscores.pdf
John-2010-some_file.pdf
Smith-2009-some_other_file.pdf

Muszę zmienić nazwy plików, aby pierwszy rok był np.

YYYY-Author-rest_of_text_seperated_by_underscores.pdf
2010-John-some_file.pdf
2009-Smith-some_other_file.pdf

Oznacza to przeniesienie elementu „YYYY-” na początek.

Nie mam unixowej „Zmień nazwę” i muszę polegać na sed, awk itp. Z przyjemnością zmieniam nazwę na miejsce.

Próbowałem dostosować tę odpowiedź, nie mając wiele szczęścia. Używanie sed do masowej zmiany nazw plików

Odpowiedzi:

4 dla odpowiedzi № 1

Widzieć BashFAQ # 100 ogólne porady na temat manipulacji sznurkiem za pomocą basha. Jedną z technik, do których się to odnosi, jest rozszerzenie parametrów, który jest mocno wykorzystywany w poniższych:

pat=-[0-9][0-9][0-9][0-9]-
for f in *$pat*; do  # expansion not quoted here to expand the glob
prefix=${f%%$pat*} # strip first instance of the pattern and everything after -> prefix
suffix=${f#*$pat}  # strip first instance and everything before -> suffix
year=${f#"$prefix"}; year=${year%"$suffix"} # find the matched year itself
mv -- "$f" "${year}-${prefix}-${suffix}"    # ...and move.
done

Tak poza tym, BashFAQ # 30 omawia wiele mechanizmów zmiany nazw, w tym jeden używający sed uruchomić dowolne transformacje.


3 dla odpowiedzi № 2

Używanie wyrażenia regularnego BASH:

re="^([^-]+-)([0-9]{4}-)(.*)$"

for f in *.pdf; do
[[ $f =~ $re ]] &&
echo mv "$f" "${BASH_REMATCH[2]}${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
done

Kiedy jesteś zadowolony z wyjścia echo polecenie przed mv.