В каталоге у меня есть куча *.html
файлов. Я хочу переименовать их все в *.txt
Как я могу это сделать? Я использую оболочку bash.
В каталоге у меня есть куча *.html
файлов. Я хочу переименовать их все в *.txt
Как я могу это сделать? Я использую оболочку bash.
Для лучшего решения (с функциональностью только bash, в отличие от внешних вызовов) см. один из других ответы.
Следующее будет делать и не требует наличия в системе программы rename
(хотя чаще всего она есть в системе):
for file in *.html; do
mv "$file" "$(basename "$file" .html).txt"
done
РЕДАКТИРОВАТЬ: Как указано в комментариях, это не работает для имен файлов с пробелами в них без надлежащего цитирования (теперь добавлено выше). При работе исключительно с вашими собственными файлами, которые, как вы знаете, не имеют пробелов в именах файлов, это сработает, но всякий раз, когда вы пишете что-то, что может быть повторно использовано позже, не пропускайте правильное цитирование.
ren *.a *.b
- person Muhammad Umer; 27.01.2015
$()
вместо устаревшего синтаксиса обратной кавычки. Повышает удобочитаемость и делает синтаксис менее двусмысленным, когда у вас есть символы, которые нужно экранировать с помощью обратной косой черты, чтобы они были буквальными внутри подстановки команды последним.
- person Charles Duffy; 10.09.2017
При использовании bash нет необходимости во внешних командах, таких как sed, basename, rename, expr и т. Д.
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
"${file%.*}.txt"
, но это может быть опасно для файлов без расширения вообще.
- person Jess; 17.12.2013
$
!
- person doug65536; 09.02.2014
mv file{1,2}
, что приводит к этот ответ. Переименование пакета Linux в Google привело бы меня прямо сюда ...
- person Maxime R.; 20.11.2014
--
: mv - $ file $ {file% .html} .txt Этот оператор предотвращает имена файлов, начинающиеся с '-', из анализируется mv как аргументы.
- person rcreswick; 09.07.2015
rename 's/\.html$/\.txt/' *.html
делает именно то, что вы хотите.
rename 's/jpg/png/' *.jpg
, это легче запомнить и набрать. Это может вызвать ошибку, если имя файла содержит jpg, поэтому я проверю его перед вводом.
- person ramwin; 09.05.2018
Это сработало для меня на OSX от .txt до .txt_bak
find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;
.txt
к .txt_bak
вам просто нужно объединить _bak
;)
- person corwin.amber; 06.07.2016
.scss
в .sass
(после преобразования на месте…): find . -name '*.scss' -exec sh -c 'mv "$0" "${0%.scss}.sass"' {} \;
- person Frank Nocke; 04.07.2018
Вы хотите использовать rename
:
rename -S <old_extension> <new_extension> <files>
rename -S .html .txt *.html
Это сделает именно то, что вы хотите - оно изменит расширение с .html
на .txt
для всех файлов, соответствующих *.html
.
Примечание: Грег Хьюгилл правильно указывает, что это не встроенная функция bash; и представляет собой отдельную команду Linux. Если вам просто нужно что-то в Linux, это должно работать нормально; если вам нужно что-то более кроссплатформенное, взгляните на один из других ответов.
rename
не связана с bash
и также доступна не на всех платформах. Я видел это только в Linux.
- person Greg Hewgill; 04.08.2009
rename -S .html .text *.html
, где -S
означает --subst-all
.
- person Marek Sebera; 13.11.2013
На Mac ...
brew install rename
rename -S .html .txt *.html
Для пользователей Ubuntu:
rename 's/\.html$/\.txt/' *.html
Это самое привлекательное решение, которое я нашел, которое работает на OSX и Linux, и оно прекрасно работает и с git!
find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;
и с git:
find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;
В этом вопросе явно упоминается Bash, но если у вас есть ZSH, это довольно просто:
zmv '(*).*' '$1.txt'
Если вы получили zsh: command not found: zmv
, просто запустите:
autoload -U zmv
А потом попробуйте еще раз.
Благодаря этой оригинальной статье за совет о zmv.
zmv '(*).html' '$1.txt'
, чтобы использовать определенные расширения файлов из исходного вопроса.
- person Alf Eaton; 11.08.2020
Вот пример команды переименования:
rename -n ’s/\.htm$/\.html/’ *.htm
-N означает, что это тестовый прогон и фактически никакие файлы не изменятся. Он покажет вам список файлов, которые будут переименованы, если вы удалите -n. В приведенном выше случае он преобразует все файлы в текущем каталоге из файла с расширением .htm в .html.
Если результат вышеуказанного тестового прогона выглядел нормально, вы можете запустить финальную версию:
rename -v ’s/\.htm$/\.html/’ *.htm
Параметр -v является необязательным, но рекомендуется включить его, потому что это единственная запись, которая у вас будет об изменениях, внесенных командой переименования, как показано в образце выходных данных ниже:
$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html
Сложная часть в середине - это подстановка Perl с регулярными выражениями, выделенная ниже:
rename -v ’s/\.htm$/\.html/’ *.htm
Кажется, что команда mmv
очень эффективно выполняет эту задачу с огромным количеством файлов (десятки тысяч в Второй). Например, чтобы переименовать все .xml
файлы в .html
файлы, используйте это:
mmv ";*.xml" "#1#2.html"
;
будет соответствовать пути, *
будет соответствовать имени файла, и они обозначаются как #1
и #2
в имени замены.
Ответы на основе exec
или каналов были либо слишком медленными, либо неуспешными для очень большого количества файлов.
Одна строчка, без петель:
ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
Пример:
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt ac8453e2-0d82-4d43-b80e-205edb754700.txt
Попробуй это
rename .html .txt *.html
использование:
rename [find] [replace_with] [criteria]
После сканирования чужого веб-сайта я обнаружил тысячи файлов без расширения .html в широком дереве подкаталогов.
Чтобы переименовать их все одним выстрелом, за исключением файлов, уже имеющих расширение .html (у большинства из них его вообще не было), это сработало для меня:
cd wwwroot
find . -xtype f \! -iname *.html -exec mv -iv "{}" "{}.html" \; # batch rename files to append .html suffix IF MISSING
В случае OP я мог бы немного изменить это, чтобы переименовывать только файлы * .txt, например:
find . -xtype f -iname *.txt -exec filename="{}" mv -iv ${filename%.*}.{txt,html} \;
Сломано (время молотка!):
-iname * .txt
- означает рассматривать ТОЛЬКО файлы, которые уже оканчиваются на .txt
mv -iv "{}. {txt, html}" - когда find передает {} в качестве имени файла, $ {filename%. *} извлекает его базовое имя без какого-либо расширения для формирования параметров в < сильный> мв. bash принимает {txt, html}, чтобы переписать его как два параметра, поэтому последняя команда выполняется как: mv -iv "filename.txt" "filename.html"
Однако необходимо исправить: работа с пробелами в именах файлов
Это хороший способ изменить сразу несколько расширений:
for fname in *.{mp4,avi}
do
mv -v "$fname" "${fname%.???}.mkv"
done
Примечание: будьте осторожны, чтобы размер расширения был одинаковым (???)
Немного поздно на вечеринку. Вы можете сделать это с помощью xargs:
ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}
Или если все ваши файлы находятся в какой-то папке
ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}
ls
. Эта команда нелепа: она бесполезно использует глобус с ls
вместо прямого использования глобуса. Это нарушит имена файлов, содержащие пробелы, кавычки и (из-за отсутствия кавычек) глобальные символы.
- person gniourf_gniourf; 27.06.2016
Красиво и просто!
find . -iname *.html -exec mv {} "$(basename {} .html).text" \;
Подобно тому, что предлагалось ранее, я сделал это следующим образом:
find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;
Я сначала проверил с помощью
find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;
Если вы предпочитаете PERL, существует короткий сценарий PERL (первоначально написанный Ларри Уоллом, создателем PERL), который сделает именно то, что вы хотите здесь: tips.webdesign10.com/files/rename.pl.txt.
Для вашего примера следующее должно помочь:
rename.pl 's/html/txt/' *.html
Переименуйте расширения файлов для всех файлов в текущем каталоге и подкаталогах без каких-либо других пакетов (используйте только сценарий оболочки):
Создайте сценарий оболочки rename.sh
в текущем каталоге со следующим кодом:
#!/bin/bash
for file in $(find . -name "*$1"); do
mv "$file" "${file%$1}$2"
done
Запустите ./rename.sh .old .new
.
Eg. ./rename.sh .html .txt
Вот что я использовал для переименования .edge
файлов в .blade.php
for file in *.edge; do mv "$file" "$(basename "$file" .edge).blade.php"; done
Работает как шарм.
К сожалению, сделать это не так просто. Вероятно, вам понадобится немного магии expr.
for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done
Удалите эхо, как только вы будете довольны, что оно делает то, что вы хотите.
Изменить: basename
, вероятно, более удобочитаем для этого конкретного случая, хотя expr
в целом более гибкий.
Вы также можете создать функцию в Bash, добавить ее в .bashrc
или что-то в этом роде, а затем использовать где угодно.
change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}
Использование:
change-ext css scss
Источник кода в функции: https://stackoverflow.com/a/1224786/6732111
Вот решение, использующее AWK. Убедитесь, что файлы находятся в рабочем каталоге. В противном случае, cd в каталог, где расположены файлы html, а затем выполните следующую команду:
for i in $(ls | grep .html); do j=$(echo $i | grep -oh "^\w*." | awk '{print $1"txt"}'); mv $i $j; done
Я написал этот код в своем .bashrc
alias find-ext='read -p "Path (dot for current): " p_path; read -p "Ext (unpunctured): " p_ext1; find $p_path -type f -name "*."$p_ext1'
alias rename-ext='read -p "Path (dot for current): " p_path; read -p "Ext (unpunctured): " p_ext1; read -p "Change by ext. (unpunctured): " p_ext2; echo -en "\nFound files:\n"; find $p_path -type f -name "*.$p_ext1"; find $p_path -type f -name "*.$p_ext1" -exec sh -c '\''mv "$1" "${1%.'\''$p_ext1'\''}.'\''$p_ext2'\''" '\'' _ {} \;; echo -en "\nChanged Files:\n"; find $p_path -type f -name "*.$p_ext2";'
В папке типа / home / ‹user› / example-files, имеющей такую структуру:
Команды будут вести себя следующим образом:
~$ find-text
Path (dot for current): example-files/
Ext (unpunctured): txt
example-files/file1.txt
example-files/file2.txt
~$ rename-text
Path (dot for current): ./example-files
Ext (unpunctured): txt
Change by ext. (unpunctured): mp3
Found files:
./example-files/file1.txt
./example-files/file1.txt
Changed Files:
./example-files/file1.mp3
./example-files/file1.mp3
~$
Вы можете использовать инструмент, предназначенный для массового переименования файлов, например renamer.
Чтобы переименовать все расширения файлов в текущей папке:
$ renamer --find ".html" --replace ".txt" --dry-run *
Еще много примеров использования можно найти здесь.
Самый простой способ - использовать rename.ul
, который присутствует в большинстве дистрибутивов Linux.
rename.ul -o -v [oldFileExtension] [newFileExtension] [выражение для поиска файла для применения]
rename.ul -o -v .oldext .newext *.oldext
Параметры:
-o: не перезаписывать уже существующий .newext
-v: подробный
-n: сухой прогон