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:
renamejest perlskryptem, który przyjmuje perlwyraż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 rasjest dopasowany dosłownie i \.pasuje do literału .(jako .jedyny wskazuje dowolny znak inny niż nowy wiersz) i zastępuje go niczym.
forPętla wykonuje wszystkie pliki, które rozpoczynają się sw.ras.(standardowe powłoki glob) i pętle nad nimi. ${var/search/replace}wyszukiwania $vardla searchi zastępuje pierwszego wystąpienia z replace, więc ${file/ras./}powraca $filez 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?