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?


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.


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 .


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:]]

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 -
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.