Я хотел бы изменить расширение файла с *.txt
на *.text
. Я попытался использовать basename
команду, но у меня возникают проблемы при изменении более одного файла.
Вот мой код:
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
Я получаю эту ошибку:
basename: too many arguments Try basename --help' for more information
bash
shell-script
rename
afbr1201
источник
источник
Ответы:
Прямо из Вики Грега :
Также смотрите запись о том, почему вы не должны анализировать
ls
.Изменить: если вы должны использовать
basename
свой синтаксис будет:источник
*.txt
синтаксис) , на голой двойной дефис--
, и использование символа% в${}
конструкции . До сих пор я никогда не сталкивался с последними двумя и не знал, что на самом деле происходит с первым.for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
Вот как я могу изменить все расширения файлов в текущем каталоге Debian.
(Это команда Perl
rename
, а неutil-linux
та. См. Почему утилита переименования в Debian / Ubuntu отличается от утилиты в других дистрибутивах, таких как CentOS? )источник
brew install rename
и заставить это работать.rename "s/oldExtension/newExtension/" **.txt
рекурсивное переименование всех * .txtfootxt.txt
. Используйте это вместо: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *
Простая команда,
rename
fromutil-linux
, сделает это за вас, она заменит все «txt» на «text» во всех файлах, соответствующих «* .txt»:источник
rename
изменяет первое вхождение, так что лучше сделайте этоrename .txt .text
, но это все равно не всегда будет работать (например, оно переименовываетсяfoo.txtx.bar.txt
вfoo.textx.bar.txt
).rename
команда на самом делеperl-rename
использует регулярные выражения perl. Для этого, эквивалентная команда будет:rename 's/.txt/.text/' *.txt
. Люди должны проверитьman rename
свою систему, чтобы узнать, какая у них есть.Выше работает нормально, но ограничивается текущим каталогом. Попробуйте команду ниже, которая является гибкой с подкаталогами. Он переименует все
.txt
файлы в структуре каталогов с новым расширением.источник
rename
может обрабатывать несколько файлов в качестве аргумента, вы можете значительно ускорить процесс, используя+
вместо того,\;
чтобы их было многоfootxt.txt
. Используйте это вместо: unix.stackexchange.com/questions/19654/…источник
Ответы здесь, на которые ссылаются
s/oldExtension/newExtension/
, неверны. Если вы используетеs/txt/text/
, вы бы конвертироватьfootxt.txt
вfootext.txt
, который не то , что вы хотите. Даже если вы используетеs/.txt/.text/
, это будет преобразованоfootxt.txt
вfo.text.txt
.Вы должны использовать,
\.
чтобы соответствовать периоду (.
будет соответствовать любой символ). И трейлинг,$
чтобы соответствовать концу строки. Только это будет правильно соответствовать расширению.источник
Основываясь на ответе @Prince John Wesley, вот простой bash-скрипт для изменения всех расширений файлов в текущем каталоге с
ext1
наext2
. Также выводит имена переименованных файлов.Пример использования (при условии, что имя скрипта таково
change-ext
):источник
for...
) двумя строками:shopt -s globstar
иfor f in **/*.$1
. Требуется Bash 4+.Причина № 53 для перехода на Zsh:
zmv '(*).txt' '$1.text'
источник
скажем, ваши файлы разбросаны по разным каталогам. Предполагая, что dirx является вашим родительским каталогом, это можно сделать с помощью команды find:
источник
Это то, что работает для меня:
источник
Когда ты
и целевое расширение .text, вы бы сделали это следующим образом -
источник
for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
Если вы хотите узнать, что пошло не так в вашей версии: вы использовали
$files
вместо$x
нее команду basename. Так что это должно работать (хотя и не проверено):источник