Jak mogę zmienić nazwę wielu plików, usuwając znak lub ciąg?

21

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?

Paweł
źródło
Czy chcesz usunąć tylkoras , czyli skończy się sw..001, albo ras.pozostawiając sw.001?
Kevin
prawdopodobnie chciałbym usunąć „ras”. czy polecenie byłoby zupełnie inne?
Paul
Nie, tylko czy uwzględnisz \.we wzorach.
Kevin

Odpowiedzi:

35

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.

Kevin
źródło
Czy możesz wyjaśnić swoją odpowiedź innym uczącym się od? Co robi „s / ras \ .// sw.ras. *”? Chyba wiem o tym, ale chcę mieć pewność, a inni też się nauczą. Druga opcja w ten sam sposób.
H_7
1
@ H_7 Dobry pomysł, dodałem wyjaśnienie.
Kevin
14

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 .

alexg
źródło
1
To świetne narzędzie !!!
Christian
5

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:]]
Chris Down
źródło
1

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 -
gopherIT
źródło