W odpowiedzi na moje poprzednie pytanie , czy mam wiele plików formularza
sw.ras.001
sw.ras.002
sw.ras.003
…
Jakiego polecenia mogę użyć, aby usunąć ras.
środek wszystkich plików?
\.
we wzorach.
W odpowiedzi na moje poprzednie pytanie , czy mam wiele plików formularza
sw.ras.001
sw.ras.002
sw.ras.003
…
Jakiego polecenia mogę użyć, aby usunąć ras.
środek wszystkich plików?
\.
we wzorach.
Odpowiedzi:
Możesz to zrobić za pomocą dość małej modyfikacji którejkolwiek z odpowiedzi z ostatniego pytania:
rename s/ras\.// sw.ras.*
lub
for file in sw.ras.*; do
mv "$file" "${file/ras./}"
done
Wyjaśnienie:
rename
jest perl
skryptem, który przyjmuje perl
wyrażenie regularne i listę plików, stosuje po kolei wyrażenie regularne do nazwy każdego pliku i zmienia nazwę każdego pliku w wyniku zastosowania wyrażenia regularnego. W naszym przypadku ras
jest dopasowany dosłownie i \.
pasuje do literału .
(jako .
jedyny wskazuje dowolny znak inny niż nowy wiersz) i zastępuje go niczym.
for
Pętla wykonuje wszystkie pliki, które rozpoczynają się sw.ras.
(standardowe powłoki glob) i pętle nad nimi. ${var/search/replace}
wyszukiwania $var
dla search
i zastępuje pierwszego wystąpienia z replace
, więc ${file/ras./}
powraca $file
z pierwszym ras.
usunięte. Polecenie zmienia więc nazwę pliku na tę samą nazwę minus ras.
. Zauważ, że przy tym wyszukiwaniu i zamianie .
jest traktowany dosłownie, a nie jako znak specjalny.
Inną opcją jest użycie mmv (Mass MoVe i zmiana nazwy):
mmv '*ras.*' '#1#2'
Nie zapomnij użyć pojedynczych cudzysłowów wokół wzorów, w przeciwnym razie gwiazdy zostaną rozszerzone na poziomie skorupy.
Narzędzie nie zawsze jest dostępne, ale jeśli nie, możesz je zainstalować za pomocą:
sudo apt-get install mmv
Zobacz stronę podręcznika tutaj .
W każdym powłoki POSIX ( bash
, dash
, ksh
, etc.)
for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
mv "${file}" "${file/ras\./}"
done
Lub z rename
:
rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]
Ostatnio musiałem masowo zmienić nazwę wielu plików, w których musiałem zastąpić ostatnie wystąpienie znaku, w którym znak występował wiele razy w nazwach plików. W tym konkretnym przypadku musiałem zastąpić ostatni myślnik -
znakiem podkreślenia _
, zmieniając to:
some-long-file-name.ext
zaangażowany w to:
some-long-file_name.ext
Zajęło to trochę czasu, ale w końcu to zrobiło:
for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done
Tutaj:
${i%-*}
dopasowuje początek nazwy pliku do ostatniego wystąpienia myślnika -
${file##*-}
dopasowuje resztę nazwy pliku po ostatnim wystąpieniu myślnika -
ras
, czyli skończy sięsw..001
, alboras.
pozostawiającsw.001
?