Chciałbym zmienić rozszerzenie pliku z *.txt
na *.text
. Próbowałem użyć basename
polecenia, ale mam problem ze zmianą więcej niż jednego pliku.
Oto mój kod:
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
Otrzymuję ten błąd:
basename: too many arguments Try basename --help' for more information
bash
shell-script
rename
afbr1201
źródło
źródło
Odpowiedzi:
Prosto z Wiki Grega :
Zobacz także wpis, dlaczego nie powinieneś analizować
ls
.Edycja: jeśli musisz użyć
basename
składni, należy:źródło
*.txt
składnia) , gołej podwójnej kreski--
i użycia symbolu% w${}
konstrukcie . Do tej pory nigdy nie spotkałem dwóch ostatnich i nie wiedziałem, co tak naprawdę dzieje się z tym pierwszym.for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
Oto jak zmieniam wszystkie rozszerzenia plików w bieżącym katalogu Debiana.
(To jest
rename
polecenie Perla , a nieutil-linux
jedno. Zobacz Dlaczego narzędzie zmiany nazwy w Debian / Ubuntu różni się od tego w innych dystrybucjach, takich jak CentOS? )źródło
brew install rename
zrobić.rename "s/oldExtension/newExtension/" **.txt
aby zmienić nazwę wszystkich * .txt rekurencyjniefootxt.txt
. Zamiast tego użyj tego: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *
To proste polecenie,
rename
fromutil-linux
, zrobi to za Ciebie, zamieni każde wystąpienie „txt” na „text” we wszystkich plikach pasujących do „* .txt”:źródło
rename
zmienia pierwsze wystąpienie, więc lepiej zrobić torename .txt .text
, ale to jeszcze nie zawsze będzie działać (na przykład, że zmienia nazwęfoo.txtx.bar.txt
nafoo.textx.bar.txt
).rename
polecenie jest w rzeczywistościperl-rename
i używa wyrażeń regularnych perla. Za to odpowiednik polecenia będzie:rename 's/.txt/.text/' *.txt
. Ludzie powinni sprawdzićman rename
w swoim systemie, aby dowiedzieć się, który mają.Powyżej działa dobrze, ale ogranicza się do bieżącego katalogu. Wypróbuj poniższe polecenie, które jest elastyczne w przypadku podkatalogów. Zmieni nazwę wszystkich
.txt
plików w strukturze katalogów z nowym rozszerzeniem.źródło
rename
potrafi obsłużyć wiele plików jako argument, możesz znacznie przyspieszyć, używając+
zamiast tego,\;
jeśli jest wiele takich plikówfootxt.txt
. Zamiast tego użyj tego: unix.stackexchange.com/questions/19654/…źródło
Odpowiedzi tutaj odnoszące się
s/oldExtension/newExtension/
są błędne. Jeśli użyjeszs/txt/text/
, przekonwertujeszfootxt.txt
nafootext.txt
, co nie jest tym, czego chcesz. Nawet jeśli użyjeszs/.txt/.text/
, to przekonwertuje sięfootxt.txt
nafo.text.txt
.Musisz użyć,
\.
aby dopasować okres (.
pasuje do dowolnej postaci). I końcowe,$
aby dopasować do końca linii. Tylko to będzie poprawnie pasowało do rozszerzenia.źródło
W oparciu o odpowiedź @Prince John Wesley, oto prosty skrypt bash do zmiany wszystkich rozszerzeń plików w bieżącym katalogu z
ext1
naext2
. Wyświetla również nazwy plików, których nazwy są zmieniane.Przykładowe użycie (przy założeniu, że nazwa skryptu to
change-ext
):źródło
for...
) na dwie linie:shopt -s globstar
ifor f in **/*.$1
. Wymaga Bash 4+.Powód # 53, aby przejść na Zsh:
zmv '(*).txt' '$1.text'
źródło
powiedzmy, że twoje pliki są rozproszone w różnych katalogach. Zakładając, że dirx jest katalogiem nadrzędnym, można to zrobić za pomocą find:
źródło
Oto, co działa dla mnie:
źródło
Kiedy ty
a celem docelowym jest .text , zrobiłbyś to w ten sposób -
źródło
for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
Jeśli chcesz wiedzieć, co poszło nie tak w twojej wersji: Użyłeś
$files
zamiast$x
w poleceniu basename. Powinno to działać (choć nie przetestowane):źródło