Как переименовать несколько файлов, удалив расширение?

14

У меня есть несколько файлов TIFF с именем:

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

и я хочу удалить .tifв конце каждого из файлов. Как я могу использовать renameкоманду, чтобы сделать это?

Павел
источник
2
Имейте в виду, что НИКАКАЯ файловая система Linux или Unix не использует «расширения» в стиле Windows или VMS - только условно суффикс имени файла - «.tif», «.c», «.o» или «.so». "или что угодно.
Брюс Эдигер
Это нормально ... Я импортирую файлы из Windows в Linux :)
Paul
1
Технически говоря, Windows также не использует расширения файлов, просто файловый менеджер Windows 95 продолжал использовать последние символы имени файла для определения типа файла после выхода из схемы именования MS-DOS, и с тех пор соглашение осталось.
РАКК

Ответы:

24

perl«s rename(как правило , найти на Debian , где он также называется prename), или этой производной ( renameпакет на Debian):

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

util-linux rename(как обычно в Red Hat, rename.ulв Debian):

rename -- .tif '' *.tif

(обратите внимание, что это можно было бы переименовать blah.tiffany.tifв blahfany.tif)

Игнасио Васкес-Абрамс
источник
2
Я полагаю, что переименование Debian осуществляется Ларри Уоллом (поставляется с Perl?), А переименование Red Hat - из util-linux (rename.ul в Debian IIRC).
XTL
@XTL: правда. Я просто называю их так, потому что это программы «переименования», которые есть в производных Debian или Red Hat.
Игнасио Васкес-Абрамс
Спасибо! Я так и не понял, что существуют разные версии «переименования». Я предполагаю, что есть другие тонкие различия между командами в debian & redhat. Мне придется искать некоторые из их различий.
Пол
Вторая команда вызвала неверный синтаксис, но первая сработала.
HelloWorld
6

Для не переименования вы можете сделать:

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

(-и предупредить против замены файла)

XTL
источник
15
Более безопасная более быстрая версия:for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
jw013
+1 на последний комментарий здесь. Это безопаснее для имен файлов с пустыми пробелами.
petobens
1
@ jw013 ваш комментарий должен быть ответом верхнего уровня.
Роланд
1
rename -- .oldext .newext *.oldext

Это заменяет старое расширение новым. Чтобы просто удалить расширение, вы можете явно передать пустую строку в качестве аргумента.

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

С помощью приведенной выше команды все файлы с .gz.tmpрасширением в текущей папке будут переименованы в filename.gz.

Обратитесь к статье: Linux: удалите расширения файлов для нескольких файлов для деталей.

Manpreet Singh
источник
1
Это предполагает, что реализация util-linux renameнесовместима (и намного более ограничена) с традиционной renameкомандой from perl.
Стефан Шазелас
Также обратите внимание, что он заменяет первое вхождение .oldextв имени файла, а не обязательно расширение ( foo.oldextasy.oldextбудет переименовано в footasy.oldext).
Стефан Шазелас
1

Если вы используете IBM AIX, у вас не будет renameкоманды, поэтому для пакетного удаления расширений файлов вам придется использовать простые ванильные команды System V UNIX:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;
RAKK
источник
-2

мы можем сделать это рекурсивным

for i in *.gz; do mv -i $i `basename $i .gz`; done
user3361573
источник