Изменение расширения на несколько файлов

Я хотел бы изменить расширение файла из *.txt в *.text. Я попытался использовать команду basename, но у меня возникли проблемы при изменении более чем одного файла.

Я получаю эту ошибку:

basename: too many arguments Try basename --help' for more information

Вот мой код:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done
119 голосов | спросил afbr1201 29 AM000000100000004031 2011, 10:33:40

10 ответов


128

Прямо от Вики-страницы Грега :

# Переименовать все * .txt в * .text
для f в * .txt; делать
    mv - "$ f" "$ {f% .txt} .text"
сделанный

Также см. запись о том, почему вы не должны анализировать ls .

Изменить: если вам нужно использовать basename, ваш синтаксис будет выглядеть следующим образом:

для f в * .txt; делать
    mv - "$ f" "$ (basename -" $ f ".txt) .text"
сделанный
ответил jasonwryan 29 AM000000100000001331 2011, 10:52:13
107

Вот как я изменяю все расширения файлов в текущем каталоге на Debian.

rename "s/oldExtension/newExtension/" *.txt

(Это команда Perl rename, а не util-linux). См. Почему утилита переименования на Debian /Ubuntu отличается от той, что была в других дистрибутивах, например CentOS? )

ответил Matthias Braun 6 +04002014-10-06T00:45:05+04:00312014bEurope/MoscowMon, 06 Oct 2014 00:45:05 +0400 2014, 00:45:05
22

Простая команда rename из util-linux , сделает это за вас, он заменит все вхождения «txt» на «text» во всех файлах, соответствующих «* .txt»:

rename txt text *.txt
ответил lamwaiman1988 29 AM000000110000000831 2011, 11:04:08
19
rename "s/oldExtension/newExtension/" *.txt

Выше работает отлично, но ограничено текущим каталогом. Попробуйте приведенную ниже команду, которая является гибкой с подкаталогами. Он переименует все файлы .txt в структуре каталогов с новым расширением.

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;
ответил Rahul 17 FebruaryEurope/MoscowbTue, 17 Feb 2015 11:34:42 +0300000000amTue, 17 Feb 2015 11:34:42 +030015 2015, 11:34:42
7
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
ответил Prince John Wesley 29 AM000000100000004031 2011, 10:49:40
4

Основываясь на ответе @Prince John Wesley, вот простой скрипт bash для изменения всех расширений файлов в текущем каталоге от ext1 до ext2. Также выводит имена переименованных файлов.

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

Пример использования (если имя скрипта указано change-ext):

change-ext ext1 ext2
ответил Dennis Golomazov 1 FebruaryEurope/MoscowbWed, 01 Feb 2012 11:54:44 +0400000000amWed, 01 Feb 2012 11:54:44 +040012 2012, 11:54:44
4

Ответы здесь, ссылающиеся на s/oldExtension/newExtension/, неверны. Если вы используете s/txt/text/, вы бы конвертировали footxt.txt в footext.txt, что не то, что вы хотите. Даже если вы используете s/.txt/.text/, который преобразует footxt.txt в fo.text.txt.

Вы должны использовать \. для соответствия периоду (. будет соответствовать любому символу). И конечный $ для соответствия концу строки. Только это будет правильно соответствовать расширению.

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old
ответил wisbucky 2 AM00000020000001531 2017, 02:53:15
1

предположим, что ваши файлы разбросаны в разных каталогах, Предполагая, что dirx является вашим родительским каталогом, это может выполнить работу, используя find:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done
ответил Arash 11 PM00000080000002531 2014, 20:56:25
1

Это то, что работает для меня:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
ответил yegor256 27 FebruaryEurope/MoscowbMon, 27 Feb 2017 17:26:11 +0300000000pmMon, 27 Feb 2017 17:26:11 +030017 2017, 17:26:11
0

Если вы хотите знать, что пошло не так в вашей версии: вы использовали $files вместо $x в команде basename. Так что это должно работать (непроверено, хотя):

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
ответил daniel kullmann 18 FebruaryEurope/MoscowbWed, 18 Feb 2015 10:39:16 +0300000000amWed, 18 Feb 2015 10:39:16 +030015 2015, 10:39:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132