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
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
Odpowiedzi:
Dla każdego pliku a_file
w bieżącym katalogu zmień nazwę a_file
na 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:]
tr
poleceń 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, ls
moż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_file
zmiennej wszystkie pliki z rozszerzeniem .jpg.
Zaktualizuj dodaną -v
opcję mv
polecenia zgodnie z sugerowanym SDD .
Istnieje bardziej eleganckie i ogólne narzędzie o nazwie prename
.
Napisany przez Larry'ego Walla, jest dostarczany z, perl
wię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/rename
symlink 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.
find
find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
find
-name
umieszczeniu wzoru.-maxdepth 0
: Tylko bieżący katalog.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.
mv
zobaczyć, co się dzieje; możesz nie chcieć przekazać „-f”, ponieważ może to zablokować istniejące pliki