W katalogu mam kilka *.html
plików. Chciałbym zmienić ich nazwy na wszystkie*.txt
Jak mogę to zrobić? Używam powłoki bash.
bash
rename
file-rename
bmw0128
źródło
źródło
ren *.a *.b
$()
zamiast starszej składni backtick. Poprawia czytelność i sprawia, że składnia jest znacznie mniej dwuznaczna, gdy masz znaki, które musiałyby być poprzedzone odwrotnym ukośnikiem, aby były dosłowne wewnątrz podstawienia polecenia tym ostatnim.Jeśli używasz bash, nie potrzebujesz zewnętrznych poleceń, takich jak sed, basename, zmiana nazwy, wyrażenie itp.
źródło
"${file%.*}.txt"
, może to być niebezpieczne dla plików bez rozszerzenia.$
w nawiasach klamrowych nie ma nic !--
„operatora”: mv - „$ plik” „$ {plik% .html} .txt” Ten operator zapobiega nazwom plików rozpoczynającym się od a - - z parsowania przez mv jako argumentów.robi dokładnie to, co chcesz.
źródło
To działało dla mnie w OSX od .txt do .txt_bak
źródło
.txt
aby.txt_bak
po prostu mieć do łączenia_bak
;).scss
na.sass
(po konwersji w miejscu…):find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
Chcesz użyć
rename
:To robi dokładnie to, co chcesz - zmieni to rozszerzenie z
.html
na.txt
dla wszystkich pasujących plików*.html
.Uwaga: Greg Hewgill poprawnie wskazuje, że nie jest to wbudowane bash; i jest osobnym poleceniem Linuksa. Jeśli potrzebujesz czegoś w systemie Linux, powinno to działać poprawnie; jeśli potrzebujesz czegoś więcej na różnych platformach, spójrz na jedną z pozostałych odpowiedzi.
źródło
rename
program nie jest powiązanybash
i nie jest dostępny na wszystkich platformach. Widziałem to tylko w systemie Linux.rename -S .html .text *.html
gdzie-S
oznacza--subst-all
Na komputerze Mac ...
brew install rename
rename -S .html .txt *.html
źródło
Dla użytkowników Ubuntu:
źródło
To najsprytniejsze rozwiązanie, jakie znalazłem, które działa na OSX i Linuksie, i działa również ładnie z git!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
i z git:
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
źródło
Oto przykład polecenia zmiany nazwy:
-N oznacza, że jest to uruchomienie testowe i tak naprawdę nie zmieni żadnych plików. Wyświetli ci listę plików, których nazwy można zmienić, jeśli usuniesz -n. W powyższym przypadku skonwertuje wszystkie pliki w bieżącym katalogu z rozszerzenia .htm na .html.
Jeśli wynik powyższego uruchomienia testowego wyglądał dobrze, możesz uruchomić ostateczną wersję:
Opcja -v jest opcjonalna, ale warto ją uwzględnić, ponieważ jest to jedyny rekord, w którym będziesz mieć zmiany dokonane za pomocą polecenia rename, jak pokazano w przykładowym wyniku poniżej:
Trudna część pośrodku to podstawienie Perla wyrażeniami regularnymi, podkreślone poniżej:
źródło
To pytanie wyraźnie wspomina o Bash, ale jeśli zdarzy ci się mieć ZSH, jest to dość proste:
Jeśli otrzymasz,
zsh: command not found: zmv
po prostu uruchom:A potem spróbuj ponownie.
Dzięki temu oryginalnemu artykułowi na wskazówkę o zmv.
źródło
Po zaindeksowaniu czyjejś witryny internetowej skończyło się to tym, że tysiące plików nie ma rozszerzenia .html w szerokim drzewie podkatalogów.
Aby zmienić nazwę wszystkich w jednym ujęciu, z wyjątkiem plików, które mają już rozszerzenie .html (większość z nich w ogóle nie miała), działało to dla mnie:
W przypadku OP mogę to nieco zmodyfikować, aby zmienić tylko nazwy plików * .txt, tak jak poniżej:
W podziale (hammertime!):
-iname * .txt
- oznacza, że uwzględniają TYLKO pliki, które kończą się na .txt
mv -iv "{}. {txt, html}" - Gdy find podaje {} jako nazwę pliku, $ {nazwa_pliku%. *} wyodrębnia swoją nazwę basename bez żadnego rozszerzenia, aby utworzyć parametry dla mv . bash bierze {txt, html}, aby przepisać go jako dwa parametry, więc końcowe polecenie działa jako:
mv -iv "filename.txt" "filename.html"
Niezbędna poprawka: radzenie sobie ze spacjami w nazwach plików
źródło
Polecenia
mmv
wydaje się bardzo sprawnie wykonać to zadanie na ogromną liczbę plików (dziesiątki tysięcy na sekundę). Na przykład, aby zmienić nazwę wszystkich.xml
plików na.html
pliki, użyj tego:;
będzie pasował do ścieżki,*
będzie pasował do nazwy pliku, a te są nazywane#1
i#2
w nazwie zastępczej.Odpowiedzi na podstawie
exec
lub potoki były zbyt wolne lub nie powiodły się w przypadku bardzo dużej liczby plików.źródło
Spróbuj tego
stosowanie:
źródło
Trochę późno na imprezę. Możesz to zrobić za pomocą xargs:
Lub jeśli wszystkie twoje pliki są w jakimś folderze
źródło
ls
. To polecenie jest niedorzeczne: bezużytecznie używa globu zls
zamiast globalnego użycia globusa. Spowoduje to zerwanie nazw plików zawierających spacje, cytaty i (z powodu braku cytatów) znaków globalnych.To dobry sposób na modyfikację wielu rozszerzeń jednocześnie:
Uwaga: uważaj, aby rozmiar rozszerzenia był taki sam (???)
źródło
Ładne i proste!
źródło
Jeśli wolisz PERL, istnieje krótki skrypt PERL (pierwotnie napisany przez Larry'ego Walla, twórcę PERL), który zrobi dokładnie to, co chcesz tutaj: tips.webdesign10.com/files/rename.pl.txt .
W twoim przykładzie należy wykonać następujące czynności:
źródło
Podobnie jak wcześniej zasugerowano, tak to zrobiłem:
Najpierw zatwierdziłem
źródło
Jedna linia, bez pętli:
Przykład:
źródło
Niestety nie jest to łatwe do przenoszenia. Prawdopodobnie potrzebujesz odrobiny magii expr.
Usuń echo, gdy będziesz zadowolony, że zrobi to, co chcesz.
Edycja:
basename
jest prawdopodobnie nieco bardziej czytelna w tym konkretnym przypadku, chociażexpr
ogólnie jest bardziej elastyczna.źródło
Oto, do czego zmieniałem nazwy
.edge
plików.blade.php
Działa jak urok.
źródło
Możesz także utworzyć funkcję w Bash, dodać ją
.bashrc
lub coś, a następnie użyć jej w dowolnym miejscu.Stosowanie:
Źródło kodu w funkcji: https://stackoverflow.com/a/1224786/6732111
źródło
Zmień nazwy rozszerzeń plików dla wszystkich plików w bieżącym katalogu i podkatalogach bez żadnych innych pakietów (użyj tylko skryptu powłoki):
Utwórz skrypt powłoki
rename.sh
w bieżącym katalogu z następującym kodem:Uruchom to
./rename.sh .old .new
.Na przykład.
./rename.sh .html .txt
źródło