Zmień nazwę plików w folderze lokalnym, dodając prefiks lub sufiks

12

Mam wiele plików w folderze i chcę dodać do nich albo prefiks, albo sufiks (nie oba ). Sprawdziłem tutaj i dowiedziałem się, że mogę korzystać

for filename in *.jpg; do mv "$filename" "prefix_$filename"; done;

aby dodać prefiks do wszystkich plików kończących się na .jpg(a jeśli .jpggo usunę, doda prefiks do wszystkich plików w bieżącym folderze).

Chciałbym jednak móc

  • Dodaj sufiks (czyli zmień nazwę filename.extna filename.whatever.ext),
  • Sprawdź, czy prefiks lub sufiks jest już obecny, a następnie pomiń,
  • Utwórz alias, który akceptuje argumenty takie jak addprefix whatever *.extlubaddsufix whatever *.*
Ten brazylijski facet
źródło

Odpowiedzi:

10

Jeśli używasz bash, to jedna wkładka może zrobić to za Ciebie (zakładając, że masz zmienne $prefix, $suffixi $extensionłatwo dostępne)

mv "$filename" "$prefix${filename%.$extension}$suffix.$extension"

Możesz mieć takie skrypty

#!/bin/bash
# Usage: addprefix <prefix> <files>

prefix=$1
shift
for f in "$@"
do
  mv "$f" "$prefix$f"
done

i

#!/bin/bash
# addsuffix <suffix> <files>

suffix=$1
shift
for f in "$@"
do
  extension=${f##*.}
  if [ -z $extension ]; then
    mv "$f" "$f$suffix"
  else
    mv "$f" "${f%.$extension}$suffix.$extension"
  fi
done
Aaron Okano
źródło
To prawie idealne! Byłoby idealnie, gdyby (1) sprawdził, czy prefiks lub sufiks jest już obecny (a następnie pominięty), i (2) działał na plikach bez rozszerzenia. Przepraszam, że tak bardzo przeszkadzam ...
Ten Brazylijczyk
Dla (1) możesz (myślę, że nie testowałem) dodać sprawdzanie prefiksu, zawijając mv w if [ $f == $prefix* ]i możesz zmienić sufiks za if [ $f == *$suffix$([ ! -z $extension ] && echo -n '.')$extension ]pomocą kilku poleceń mv w addsuffix. Dla (2) powinien już działać na plikach bez rozszerzenia, chyba że jestem okropnym programistą.
Aaron Okano
7

Istnieje polecenie Perla,rename które powinno załatwić sprawę. Uwaga: wywoływanych jest kilka różnych poleceń rename, więc upewnij się, że masz skrypt Perla, który oczekuje perlexprjako argumentu. Jest to renamepolecenie dostarczone przez perlpakiet na Debianie i jego pochodnych (Ubuntu, Mint,…), ale nie na innych dystrybucjach, które mogą mieć inne narzędzie o nazwie rename.

martin@martin ~/test % touch a.txt
martin@martin ~/test % touch b.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt
martin@martin ~/test % rename 's/^(prefix)?/prefix/' *.txt
martin@martin ~/test % ll
insgesamt 0
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixa.txt
-rw-rw-r-- 1 martin martin 0 Sep 19 23:56 prefixb.txt

Jak widać, jest idempotentny - nie doda ponownie prefiksu, gdy wywołasz go wiele razy.

Działa poprzez zamianę początku ciągów (o zerowej długości ^) lub początku, a następnie opcjonalnego prefixciągu na prefix.

Opiszę to jako skrypt dla powłoki lub funkcję powłoki jako ćwiczenie dla ciebie :)

Postfiks jest jednak nieco trudniejszy, ponieważ musisz dowiedzieć się, która część nazwy pliku stanowi rozszerzenie ...

Martin von Wittich
źródło
To miła odpowiedź, ale szukałem czegoś bardziej uniwersalnego; dla tej odpowiedzi potrzebujesz zarówno perla, jak i tego konkretnego (lub równoważnego) rename. Wiem, że sufiksy są nieco trudniejsze, nie zostało to uwzględnione w łączonym pytaniu, a ja jestem początkującym w Linuksie, Bashu, skryptach powłoki, Perlu i wyrażeniach regularnych, więc „nieco trudniej” jest dla mnie dość trudne ! :)
Ten Brazylijczyk
4

Z zsh:

autoload zmv # in ~/.zshrc
zmv '(*~*suffix).ext' '${1}suffix.ext'

~jest masek operatora Oznacza except się zsh.

Stéphane Chazelas
źródło
1

Prosty przykład zmiany prefiksu i rozszerzenia wszystkich obrazów w bieżącym folderze.

prefix=EG_
extension=.jpg
for i in $(ls); do mv $i "$prefix${i%.JPG}$extension";  done

Jeśli chcesz sprawdzić, jak wpłynie to na twoje dane przed zmianą, zastąp mv przez echo

wyjście dla IMG_7993.JPG to EG_IMG_7993.jpg

Jinxi
źródło