Как изменить расширение нескольких файлов?

Вот другое решение:

sed 's/^<[^>]*>//g' file.txt | tr '\012' '|' | awk -F'|' '{OFS=FS; print $3,$2,$1}'
9251000014|220095|Operation successful.

Если вы хотите удалить завершающий . вы можете сделать это либо с помощью sed , либо awk (нет необходимости в обоих). Вот простое решение с sed :

sed -e 's/^<[^>]*>//g' -e 's/\.$//' file.txt
258
09.04.2019, 03:50
12 ответов

Прямо из Greg's Wiki:

# Rename all *.txt to *.text
for f in *.txt; do 
    mv -- "$f" "${f%.txt}.text"
done

*.txt - это шаблон глобуса, использующий * как подстановочный знак для поиска любой строки. *.txt соответствует всем именам файлов, заканчивающимся на '.txt'.

-- отмечает конец списка опций. Это позволяет избежать проблем с именами файлов, начинающимися с дефисов.

${f%.txt} - это расширение параметра, заменяемое значением переменной f с удалением .txt из конца.

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

Если вам нужно использовать basename, ваш синтаксис будет таким:

for f in *.txt; do
    mv -- "$f" "$(basename -- "$f" .txt).text"
done
318
29.04.2021, 00:58

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

for x in *.txt
do
  mv "$x" "`basename "$x" .txt`.text"
done
1
29.04.2021, 00:58

На основе ответа @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
10
29.04.2021, 00:58

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

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done
9
29.04.2021, 00:58
rename "s/oldExtension/newExtension/" *.txt

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

find . -type f -name "*.txt" -exec rename 's/\.txt$/.newext/' '{}' \;
43
29.04.2021, 00:58

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

rename txt text *.txt
58
29.04.2021, 00:58

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

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

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

194
29.04.2021, 00:58
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
10
29.04.2021, 00:58

Вот что у меня работает:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
3
29.04.2021, 00:58

Ответы здесь со ссылкой на 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
29
29.04.2021, 00:58

Причина #53 для перехода на zsh:

zmv '(*).txt' '$1.text'

15
29.04.2021, 00:58

Когда вы

do not have an extension for the source files

и целевое расширение .text вы бы сделали это так-

for f in *; do mv -- "$f" "${f%.\*}.text"; done
5
29.04.2021, 00:58

Теги

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