Jak zmienić nazwę wielu plików, usuwając rozszerzenie?

14

Mam wiele plików tiff o nazwie:

sw.001.tif
sw.002.tif
...

i chcę usunąć .tifna końcu każdego z plików. Jak mogę to zrobić za pomocą renamepolecenia?

Paweł
źródło
2
Należy pamiętać, że ŻADNY system plików Linux lub Unix nie używa „rozszerzeń” w stylu Windows lub VMS - to tylko konwencja, że ​​przyrostek nazwy pliku to „.tif” lub „.c” lub „.o” lub „.so " lub cokolwiek.
Bruce Ediger,
W porządku ... Importuję pliki z systemu Windows do systemu Linux :)
Paul
1
Technicznie rzecz biorąc, system Windows również nie używa rozszerzeń plików, po prostu menedżer plików systemu Windows 95 używał ostatnich znaków nazwy pliku do określenia typu pliku po zerwaniu ze schematem nazewnictwa MS-DOS i od tego czasu konwencja pozostała.
RAKK

Odpowiedzi:

24

perl„y rename(jak zwykle znajduje się na Debianie gdzie również nazywana prename) lub tej pochodnej ( renameopakowania na Debianie)

rename 's/\.tif$//' *.tif

util-linux rename(jak zwykle można znaleźć w Red Hat rename.ulna Debianie):

rename -- .tif '' *.tif

(zwróć uwagę, że ta nazwa zmieniłaby się blah.tiffany.tifna blahfany.tif)

Ignacio Vazquez-Abrams
źródło
2
Uważam, że nazwa „Debian” pochodzi od Larry'ego Walla (pochodzi z Perla?), A nazwa „Red Hat” pochodzi od util-linux (rename.ul w Debian IIRC).
XTL
@XTL: Prawda. Nazywam je tak, ponieważ są to programy „zmieniające nazwy” znajdujące się w pochodnych Debiana lub Red Hata.
Ignacio Vazquez-Abrams,
Dzięki wielkie! Nigdy nie zdawałem sobie sprawy, że istnieją różne wersje „zmiany nazwy”. Zakładam, że istnieją inne subtelne różnice między poleceniami w debian i redhat. Będę musiał sprawdzić niektóre z ich różnic.
Paul
Drugie polecenie spowodowało niepoprawną składnię, ale pierwsze zadziałało.
HelloWorld,
6

Aby zmienić nazwę, możesz:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i, aby ostrzec przed zamianą pliku)

XTL
źródło
15
Bezpieczniejsza, szybsza wersja:for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
jw013
+1 do ostatniego komentarza tutaj. Bezpieczniej jest na nazwach plików z pustymi spacjami.
petobens
1
@ jw013 twój komentarz powinien być odpowiedzią najwyższego poziomu.
Roland
1
rename -- .oldext .newext *.oldext

Zastępuje to stare rozszerzenie nowym. Aby po prostu usunąć rozszerzenie, możesz jawnie przekazać pusty ciąg znaków jako argument.

rename -- .gz.tmp  '' *.gz.tmp

Za pomocą powyższego polecenia wszystkie pliki z .gz.tmprozszerzeniem w bieżącym folderze zostaną zmienione na filename.gz.

Szczegółowe informacje można znaleźć w artykule: Linux: usuń rozszerzenia plików dla wielu plików .

Manpreet Singh
źródło
1
Zakłada się, że implementacja util-linux renamejest niezgodna (i znacznie bardziej ograniczona) od tradycyjnego renamepolecenia z perl.
Stéphane Chazelas
Zauważ też, że zastępuje ono pierwsze wystąpienie .oldextw nazwie pliku, niekoniecznie rozszerzenie ( foo.oldextasy.oldextzostanie zmienione na footasy.oldext).
Stéphane Chazelas
1

Jeśli używasz systemu IBM AIX, nie będziesz mieć renamekomendy, więc aby grupowo usunąć rozszerzenia plików, musisz użyć zwykłych waniliowych komend systemu UNIX w wersji V:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;
RAKK
źródło
-2

czy możemy to zrobić rekurencyjnie?

for i in *.gz; do mv -i $i `basename $i .gz`; done
użytkownik3361573
źródło