Szukałem sposobu na zmianę nazwy ogromnej liczby plików o podobnych nazwach, bardzo podobnych do tego (pytanie związane z systemem Windows), z wyjątkiem tego, że używam * nix (osobno dla Ubuntu i FreeBSD). Podsumowując, używając powłoki (Bash, CSH itp.) Jak masowo zmienić nazwy wielu plików, na przykład następujące pliki:
Beethoven - Fur Elise.mp3
Beethoven - Moonlight Sonata.mp3
Beethoven - Oda do radości.mp3
Beethoven - Rage Over the Lost Penny.mp3
zostanie przemianowany w ten sposób?
Fur Elise.mp3
Moonlight Sonata.mp3
Oda do radości.mp3
Rage Over the Lost Penny.mp3
Powodem, dla którego chcę to zrobić, jest to, że zbiór plików przejdzie do katalogu o nazwie „Beethoven” (tj. Przedrostek nazw plików), a posiadanie tych informacji w samej nazwie pliku będzie zbędne.
Podobnie jak wiele innych rzeczy w Linuksie / Uniksie, jest na to więcej niż jeden sposób!
Niektórzy mogą użyć mmv (masa mv).
Polecenie rename lub prename, które jest dostarczane z niektórymi pakietami Perla (nowsze wersje Ubuntu i Debian), może to zrobić.
Zauważ, że narzędzie zmiany nazwy w Fedorze 10 nie jest tym samym programem i działa inaczej. Jest częścią innego pakietu, util-linux-ng i można go znaleźć tutaj .
Często po prostu chodzę do powłoki, by zrezygnować z przyzwyczajenia (w końcu takie narzędzia nie zawsze istniały).
Spowoduje to utworzenie katalogu Beethoven, a następnie przeniesienie pliku do tego katalogu / nazwa pliku, gdzie nazwa pliku ma „Beethoven -” zastąpiony niczym.
W ramach testu przed:
Po:
źródło
Wypróbuj to rozwiązanie, zaimplementowane przy użyciu kombinacji grep i zmiany nazwy. Zakłada się, że masz całą masę katalogów, których nazwę musisz zmienić. Jeśli jest ich tylko kilka, wybrałbym podejście ręczne, ze schematem „Artist -” na stałe dla każdego.
Objaśnienie find :
Polecenie find wyszukuje wszystkie pliki z rozszerzeniem .mp3 w bieżącej hierarchii plików i wywołuje argument przekazywany do -exec dla każdego. Należy zauważyć, że w ciągu -exec , {} odnosi się do argumentu przekazanego przez znaleziska (plik ścieżka + nazwa). W
\;
gwarantuje;
zostanie przekazany do zmiany nazwy i zamiast wskazujący koniec find polecenia.Powyższe polecenie ma przełącznik -n (brak akcji); dlatego powie ci tylko, co by się stało, gdybyś go uruchomił. Polecam uruchomienie tego polecenia bez przełącznika -n tylko po uruchomieniu go raz i jesteś zadowolony z proponowanych wyników.
Teraz regexp.
^
dopasowuje początek łańcucha.$
dopasowuje koniec łańcucha..
pasuje do dowolnej postaci.*
oznacza zero lub więcej poprzedniej konstrukcji. np..*
oznacza zero lub więcej znaków.\s
oznacza dowolny znak spacji.\S
oznacza dowolny znak spacji.()
zostaje schwytane i jest odzwierciedlane jako$1
,$2
w zależności od jego pozycji.Wyrażenie regularne:
(.*/)
-
”:.*-
(.*)
Oto mój testowy przebieg:
Regexp to trudna sprawa i napisałem wiele błędów, więc chętnie przyjmę wszelkie uwagi na temat braku zalet tego. Wiem, że znalazłem sporo testujących to.
źródło
Przygotowałem program Java wiersza polecenia, który sprawia, że zmiana nazw plików (i katalogów) jest dziecinnie prosta, szczególnie w przypadku skryptów. Jest darmowy i open source, więc możesz go zmodyfikować do treści twojego serca:
RenameWand
http://renamewand.sourceforge.net/
Kilka odpowiednich przykładów użycia:
Przenieś pliki formularza
"<a> - <b>"
do odpowiedniego katalogu"<a>"
:Sortuj pliki według czasu ostatniej modyfikacji i zmieniaj ich nazwy za pomocą 3-cyfrowej liczby:
Zmień kolejność części nazwy pliku i zmień wielkość liter:
źródło
zmv
Narzędzie zmiany nazwy zsh jest bardzo dobre.Więcej notatek tutaj ...
źródło
W przypadku głów Penguin można to łatwo zrobić za pomocą skryptu powłoki lub skryptu AWK. Dla nas, zwykłych śmiertelników, możesz spróbować Midnight Commander. Występuje w większości dystrybucji Linuksa, począwszy od znaku zachęty powłoki mc -a. Możesz zmieniać nazwy plików za pomocą wyrażeń regularnych. Użyłem tego artykułu z GeekStuff http://www.thegeekstuff.com/2009/06/how-to-rename-files-in-group/, aby mi pomóc.
źródło
Oto prosty przykład wiersza polecenia. Miałem słowo „biały” pośrodku nazw plików png. Chciałem go wyjąć i zostawić tylko jeden znak podkreślenia. To załatwiło sprawę:
źródło
Użyj vidir, a następnie użyj funkcji edytora, aby zastosować wzorzec zmiany nazwy.
źródło
Na * nix bez perla
rename
dostępneW niektórych * nix zmiana nazwy nie jest dostępna, więc należy zmienić nazwę za pomocą innej metody. Kilka lat temu zasugerowałem
zmv
tutaj, która, choć świetna, niekoniecznie jest dostępna.Używając wbudowanych i sed, możemy szybko zrobić skrypt powłoki, aby to zrobić, co daje nam bardzo podobną składnię do skryptu zmiany nazwy perla, a mimo braku pewności obsługi błędów, wykonuje zadanie.
Stosowanie
Powiedzmy, że chcieliśmy również utworzyć foldery docelowe ...
Ponieważ
mv
nie tworzy folderów, których nie możemy używaćsedrename
tak, jak tutaj, ale jest to dość niewielka zmiana, więc myślę, że fajnie byłoby też to uwzględnić.Potrzebujemy funkcji narzędzia
abspath
(lub ścieżki bezwzględnej), abyśmy mogli wygenerować folder docelowy dla wzorca sed / rename, który zawiera nową strukturę folderów.Zapewni to, że znamy nazwy naszych folderów docelowych. Kiedy zmieniamy nazwę, będziemy musieli użyć jej w nazwie pliku docelowego.
Oto skrypt obsługujący pełny folder ...
Oczywiście nadal działa, gdy nie mamy również określonych folderów docelowych.
Jeśli chcielibyśmy umieścić wszystkie utwory w folderze,
./Beethoven/
możemy to zrobić:Stosowanie
Runda bonusowa ...
Za pomocą tego skryptu przenieś pliki z folderów do jednego folderu:
Zakładając, że chcemy zebrać wszystkie dopasowane pliki i umieścić je w bieżącym folderze, możemy to zrobić:
Uwaga na wzorce wyrażeń regularnych sed
W tym skrypcie obowiązują reguły regularnych wzorców sed, wzorce te nie są PCRE (wyrażenia regularne zgodne z Perl). Możesz mieć rozszerzoną składnię wyrażeń regularnych, używając jednej
sed -r
lub wsed -E
zależności od platformy.Zobacz zgodny z POSIX
man re_format
pełny opis podstawowych i rozszerzonych wzorców wyrażeń regularnych sed.źródło