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


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

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


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: удалите расширения файлов для нескольких файлов для деталей.


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;

-2

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

for i in *.gz; do mv -i $i `basename $i .gz`; done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.