Jak łatwo zmienić nazwę wielu plików za pomocą wiersza polecenia?

103

Jednym ze sposobów szybkiej zmiany nazw plików w systemie Windows jest

F2 > Rename > Tab (to next file) > Rename ...

Ale w Ubuntu / Nautilus nie mogę przejść do następnego pliku. Ale w Linuksie myślę, że musi istnieć alternatywa dla wiersza poleceń.

Czasami jednak potrzebuję większej kontroli nad sposobem zmiany nazw określonych plików. W takim przypadku być może lepiej będzie można przejść do następnego pliku

Jiew Meng
źródło
1
Czy możesz zdefiniować „więcej kontroli”? Nie jestem pewien, o co dokładnie pytasz ...
Dang Khoa,
Myślę, że na to pytanie nie ma odpowiedzi. To, o co prosisz (F2, a następnie przejście do trybu F2 do następnego pliku) jest obecnie niedostępne, myślę, że w Nautilusie.
don.joey

Odpowiedzi:

187

Używam renamecały czas. Jest to dość proste, ale mam nadzieję, że znasz podstawowe wyrażenia regularne:

rename "s/SEARCH/REPLACE/g"  *

To zastąpi ciąg SEARCHz REPLACEkażdym pliku (to znaczy *). Te /gśrodki globalne, więc jeśli miał SEARCH_SEARCH.jpg, to by zostać zmieniona REPLACE_REPLACE.jpg. Gdybyś tego nie /gzrobił, zastąpiłby go tylko raz, a więc teraz nazwany REPLACE_SEARCH.jpg. Jeśli chcesz, /iaby wielkość liter nie była rozróżniana, dodaj (to byłoby /gilub /igna końcu).

Dzięki wyrażeniom regularnym możesz zrobić znacznie więcej.

Zauważ, że renamejest to polecenie prename(inaczej Perl rename), które obsługuje pełne wyrażenia regularne Perla. Jest inny, renamektóry wykorzystuje wzorce i nie jest tak potężny. prenameKiedyś był instalowany domyślnie na Ubuntu (wraz z Perlem), ale teraz możesz zrobić:

sudo apt install rename

Oto kilka przykładów:

Prefiks

Dodaj :

rename 's/^/MyPrefix_/' * 
  • document.pdf przemianowany na MyPrefix_document.pdf

Usuń :

Możesz także usunąć niechciane ciągi. Załóżmy, że miałeś 20 plików MP3 o nazwach podobnych CD RIP 01 Song.mp3i chciałeś usunąć część „CD RIP” i chciałeś usunąć ją ze wszystkich za pomocą jednego polecenia.

rename 's/^CD RIP //' *
  • CD RIP 01 Song.mp3 do 01 Song.mp3

Zwróć uwagę na dodatkowe miejsce w środku '^CD RIP ', bez tego miejsca wszystkie pliki miałyby spację jako pierwszy znak pliku. Zauważ też, że zadziała to bez ^znaku, ale pasowałoby CD RIP do dowolnej części nazwy pliku. Te ^gwarancje to tylko usuwa znaki, jeśli są one początek pliku.

Przyrostek

Dodaj :

rename 's/$/_MySuffix/' *
  • document.pdf przemianowany na document.pdf_MySuffix

Zmień :

rename 's/\.pdf$/.doc/' *

zmieni się Something.pdfw Something.doc. (Powodem odwrotny ukośnik jest .to wieloznaczny w regexp więc .pdfmeczów qPDFnatomiast \.pdftylko pasuje dokładnie ciąg .pdf. Również bardzo ważne jest, aby pamiętać, że jeśli nie jesteś zaznajomiony z BASH, należy umieścić backslashy w apostrofach! Nie można pominąć cytaty lub użyj podwójnych cudzysłowów, albo bash spróbuje je przetłumaczyć. Bash \. i "\." równa się .. (Ale używane są podwójne cudzysłowy i odwrotne ukośniki, na przykład „\ n” dla nowej linii, ale ponieważ "\."nie jest prawidłową sekwencją odwrotną, tłumaczy się na .)

W rzeczywistości możesz nawet zawrzeć części ciągu w cudzysłowie zamiast całości: 's/Search/Replace/g'jest taki sam jak s/'Search'/'Replace'/gi s/Search/Replace/gBASH. Musisz tylko uważać na znaki specjalne (i spacje).


Sugeruję użycie tej -nopcji, jeśli nie jesteś pewien, że masz poprawne wyrażenia regularne. Pokazuje, co zostanie przemianowane, a następnie wychodzi bez robienia tego. Na przykład:

rename -n s/'One'/'Two'/g *

Spowoduje to wyświetlenie wszystkich zmian, które wprowadziłby, gdyby nie umieścić -ntam flagi. Jeśli wygląda dobrze, naciśnij, Upaby wrócić, a następnie skasuj -ni naciśnij Enter(lub zamień na, -vaby wyświetlić wszystkie wprowadzone zmiany).

Uwaga : renameDomyślnie wersje Ubuntu powyżej 17.04 nie są dostarczane , jednak nadal są dostępne w repozytoriach. Użyj, sudo apt install renameaby go zainstalować

Matt
źródło
Jak mogę uzyskać przyrostek „dynamiczny”. Jak 001 - 010 itd. Możliwe?
Jiew Meng
Hmm .. Próbowałem coś napisać, ale to nie zadziałało. Głównie dlatego, że gdy dodam 1 do 001, dodaje się do 2, a nie do 002. W przeciwnym razie mógłbym użyć zmiennych do utrzymania pozycji liczbowej, a następnie dołączyć ją. Poza tym przypomniałem sobie, zanim dowiedziałem się o renamepoleceniu, tak zrobiłem, aby dołączyć:for f in *; do mv -v "$f" "prependThis$f"; done
Mat.
2
@jiewmeng Tak. Użyj (?:\.[0-9]{3})$we wzorcu, aby dopasować wszystkie 3-cyfrowe rozszerzenia plików w grupie pasywnej. Przykład: rename s/^my_favorite_movie.avi(?:\.[0-9]{3})$/random_movie.avi/ *. Spójrz na ten ściągawka wyrażeń regularnych .
sergio91pt
@ sergio91pt jest to niezły ściągawka. Ale o co chodzi? Musi to być perl - ale nie można tam znaleźć takiej notatki.
Adobe
@Adobe Jest to ogólna zasada dla „wyrażenia regularnego opartego na perlu”. Spójrz na notatkę o znaku + i kolumnę o klasach znaków POSIX.
sergio91pt
21

Wypróbuj pyrenamer .

Nie jest zintegrowany z nautilus, ale wykonuje zadanie. Oto opinia.

Thunar (część XFCE) ma również nazwę, którą można uruchomić osobno.

Masowa zmiana nazwy Thunar

RolandiXor
źródło
2
dzięki za wspomnienie o funkcjonalności Thunar. Jeśli masz Thunar - wybierz pliki w folderze i naciśnij F2.
Maks.
9

Wydaje się, że na starterze jest projekt o nazwie nautilus-renamer . Możesz go zainstalować, uruchamiając make installpo pobraniu skryptu i rozpakowaniu go. Wygląda na to, że ma jakieś funkcje lub jeśli znasz jakieś programowanie, możesz po prostu ulepszyć go do swoich potrzeb, ponieważ jest to po prostu skrypt Pythona.

wprowadź opis zdjęcia tutaj

sagarchalizować
źródło
8

W wierszu polecenia, aby zmienić nazwę pojedynczego pliku, polecenie jest po prostu

mv file1.txt file2.txt

Jeśli chcesz to zrobić wsadowo, prawdopodobnie będziesz chciał to zrobić za pomocą skryptu. Jeśli podasz więcej szczegółów, ja lub ktoś inny prawdopodobnie przygotuję jeden dla ciebie. To powiedziawszy, skrypt do dołączania rzeczy do pliku może wyglądać następująco:

#!/bin/bash
for file in *
do
    # separate the file name from its extension
    if [[ $file == *.* ]]; then
      ext="${file##*.}"
      fname="${file%.*}"
      mv "$file" "${fname}_APPENDSTUFFHERE.$ext"
    else
      mv "$file" "${file}_APPENDSTUFFHERE"
    fi
done

W zależności od tego, jak dokładnie potrzebujesz rzeczy, których nazwa zostanie zmieniona, prawdopodobnie zostanie to poprawione, na przykład jeśli masz określone reguły zmiany nazw. (Osobiście zrobiłbym to za pomocą skryptu Perla, ponieważ moje bash-foo nie jest takie świetne, ale to tylko ja.)

Zauważ, że otrzymałem oddzielenie nazwy pliku i rozszerzenia od wcześniej zadanego pytania .

Dang Khoa
źródło
7

Jeśli chcesz to zrobić bez wiersza polecenia, podobnie jak w systemie Windows, użyj klawisza strzałki w prawo zamiast klawisza Tab . Spowoduje to wybranie następnego pliku, podobnie jak karta w systemie Windows.

Rafał Cieślak
źródło
To nie to samo: nadal będziesz potrzebować ENTER, aby zakończyć zmianę nazwy, klawisza strzałki, aby przejść do następnego pliku, i F2, aby go zmienić. TAB robi to w 1 kroku po zmianie nazwy pliku.
MestreLion
@MestreLion Ale jest bardzo podobny do algorytmu opisanego w pytaniu i nie wymaga żadnego dodatkowego oprogramowania ani operacji z wiersza poleceń. Trochę przyjazne dla użytkownika.
Rafał Cieślak,
To prawda, że ​​byłaś jedyną odpowiedzią, która przynajmniej próbowała zastosować to samo podejście, co w pierwotnym pytaniu. A smutna prawda jest taka, że ​​Nautilus nie ma takiej funkcjonalności. Możesz F2 zmienić nazwę, ale to wszystko. Brak klawisza TAB, aby automatycznie przejść do następnego pliku w trybie zmiany nazwy.
MestreLion
7

Niezupełnie to samo pytanie, jak zmienić nazwę wielu plików jednocześnie? ale zasugeruję ten sam program, który zasugerowałem w tej odpowiedzi: qmv .

qmv to przydatne narzędzie z pakietu renameutils. Umożliwia używanie ulubionego edytora tekstu do zmiany nazw plików. W połączeniu z mocą vima masz doskonałe narzędzie do zmiany nazw.

Zwykle wywołuję to jak qmv -f dow katalogu, w którym chcę zmienić nazwę kilku plików. Lub jeśli chcę zmienić rekurencyjnie nazwę qmv -R -f do.

Ilekroć muszę zmienić nazwę wielu plików, zawsze wracam do qmv (i vim).

http://www.nongnu.org/renameutils/

dempa
źródło
Właśnie próbowałem tego na podstawie twojej sugestii. To naprawdę najbardziej niesamowite narzędzie, jeśli używasz vima!
ste_kwr,
3

Jeśli jedyną odpowiednią opcją jest ręczna zmiana nazwy plików, doskonałym sposobem na to jest użycie vidir(w moreutilspakiecie):

sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils
DESCRIPTION
       vidir allows editing of the contents of a directory in a text editor.
       If no directory is specified, the current directory is edited.

       When editing a directory, each item in the directory will appear on
       its own numbered line. These numbers are how vidir keeps track of what
       items are changed. Delete lines to remove files from the directory, or
       edit filenames to rename files. You can also switch pairs of numbers
       to swap filenames.

       Note that if "-" is specified as the directory to edit, it reads a
       list of filenames from stdin and displays those for editing.
       Alternatively, a list of files can be specified on the command line.

Przykłady


Selektywna zmiana nazw plików

Zawartość bieżącego katalogu roboczego:

.
├── bar
├── baz
└── foo

Uruchom vidir, zmień nazwy plików w wierszach zawierających nazwy plików, których nazwy chcesz zmienić; naciśnij CTRL+ Oi CTRL+ X:

zrzut ekranu 3

.
├── bar.bak
├── baz.old
└── foo.new

Selektywne przełączanie nazw plików

Zawartość bieżącego katalogu roboczego:

.
├── bar
├── baz
└── foo

Zawartość plików bieżącego katalogu roboczego:

$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is bar

- baz:

This is baz

- foo:

This is foo

$ 

Uruchom vidir, przełącz liczby w wierszach zawierających nazwy plików, które chcesz zmienić; naciśnij CTRL+ Oi CTRL+ X:

screenshot4

.
├── bar
├── baz
└── foo
$ for f in *; do printf '- %s:\n\n' "$f"; cat "$f"; echo; done
- bar:

This is foo

- baz:

This is bar

- foo:

This is baz

$ 

Selektywne usuwanie plików

Zawartość bieżącego katalogu roboczego:

.
├── bar
├── baz
└── foo

Uruchom vidir, usuń wiersze zawierające pliki, które chcesz usunąć; naciśnij CTRL+ Oi CTRL+ X:

zrzut ekranu2

.
└── baz
kos
źródło
2

Używam krename. Jest to aplikacja GUI. Może czytać tagi mp3 i tak dalej.

Istnieje jako osobna aplikacja, a także jako część Krusader.

Jest też renameskrypt - który jest częścią standardowej instalacji perla (prawdopodobnie masz go zainstalowaną). Sprawdź to za pomocą man rename.

Cegła suszona na słońcu
źródło