Batch zmienia nazwy plików na małe litery

17

Czy istnieje sposób na zmianę nazwy wszystkich plików w katalogu na małe | wielkie litery?

Szukam polecenia oneliner .

Kochałem TotalCommander alt+f7, teraz potrzebuję tej funkcjonalności w Terminalu

Unamata Sanatarai
źródło

Odpowiedzi:

20

Dla każdego pliku a_filew bieżącym katalogu zmień nazwę a_filena małe litery.

for a_file in *;do mv -v "$a_file" `echo "$a_file" | tr [:upper:] [:lower:]` ;done;

W przypadku wielkich liter odwróć argumenty na [:lower:] [:upper:]

trpoleceń Link

Aktualizacja

Dla jeszcze większej kontroli *można go zastąpić ls.

Na przykład w katalogu zawierającym 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg i 3.jpg w celu filtrowania tylko plików * .jpg, lsmożna użyć:

for a_file in $(ls *.jpg);do mv -v $a_file `echo $a_file | tr [:upper:] [:lower:]` ;done;

Powyższy kod przypisze do a_filezmiennej wszystkie pliki z rozszerzeniem .jpg.

Zaktualizuj dodaną -vopcję mvpolecenia zgodnie z sugerowanym SDD .

Stef K.
źródło
4
możesz podać „-v”, aby mvzobaczyć, co się dzieje; możesz nie chcieć przekazać „-f”, ponieważ może to zablokować istniejące pliki
sds
Nie działa to w przypadku plików ze spacjami w nazwie.
Tianxiang Xiong
Możesz używać cudzysłowów wokół nazwy pliku.
Stef K
2
Przepraszamy, ale część o ls * jpg to zły pomysł. mywiki.wooledge.org/ParsingLs Możesz osiągnąć ten sam wynik za pomocą * jpg w miejscu, w którym miałeś * na pierwszym miejscu.
Tink
16

Istnieje bardziej eleganckie i ogólne narzędzie o nazwie prename.

Napisany przez Larry'ego Walla, jest dostarczany z, perlwięc najprawdopodobniej jest już dostępny w twoim systemie jako /usr/bin/prename(jeśli masz alternatywne ustawienia, może być również dostępny jako /usr/bin/renamesymlink przez / etc / alternatives to prename)

Za jego pomocą możesz zmienić nazwę wielu plików w jednym poleceniu, podając dowolne wyrażenie perla (w tym między innymi podstawienie s///lub transliterację znaków tr///):

Przykłady:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

I tak dalej.

Kolejną zaletą prename jest to, że chroni cię w przypadku zmiany nazwy pliku na istniejącą nazwę pliku.

man prename po więcej szczegółów.

arielf
źródło
1

Za pomocą find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Dla find

  • Oczywiście po -nameumieszczeniu wzoru.
  • -maxdepth 0: Tylko bieżący katalog.

Dla rename

  • -n, -nono: Brak akcji: drukuj nazwy plików, których nazwy należy zmienić, ale nie zmieniaj nazwy.
  • y/source/dest/: Transliteruj znaki w przestrzeni wzorów, które pojawiają się w źródle, na odpowiedni znak w dest.
Pablo Bianchi
źródło