У меня много файлов с расширением .txt. Как удалить расширение .txt для нескольких файлов в Linux?
Я обнаружил, что
rename .old .new *.old
заменяет расширение .old
на .new
Также я хочу сделать это для файлов в подпапках.
У меня много файлов с расширением .txt. Как удалить расширение .txt для нескольких файлов в Linux?
Я обнаружил, что
rename .old .new *.old
заменяет расширение .old
на .new
Также я хочу сделать это для файлов в подпапках.
rename
немного опасен, поскольку согласно его странице руководства:
rename переименует указанные файлы, заменив появление first...
Он будет делать неправильные вещи с именами файлов, например c.txt.parser.y
.
Здесь решение с использованием find
и bash
:
find -type f -name '*.txt' | while read f; do mv "$f" "${f%.txt}"; done
Имейте в виду, что это сломается, если имя файла содержит новую строку (редко, но не невозможно).
Если у вас есть поиск GNU, это более прочное решение:
find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}"; done
Я использую это:
find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \;
Версия переименования Perl может удалить расширение следующим образом:
rename 's/\.txt$//' *.txt
Это можно объединить с поиском, чтобы также делать подпапки.
Вы можете явно передать пустую строку в качестве аргумента.
rename .old '' *.old
И с подпапками find . -type d -exec rename .old '' {}/*.old \;
. {}
является заменой записи, найденной с помощью find
, а \;
завершает список arglist для команды, указанной после -exec
.
В случае, если это помогает, вот как я это делаю с zsh:
for f in ./**/*.old; do
mv "${f}" "${f%.old}"
done
Конструкция ${x%pattern}
в zsh удаляет кратчайшее появление pattern
в конце $x
. Здесь он абстрагируется как функция:
function chgext () {
local srcext=".old"
local dstext=""
local dir="."
[[ "$#" -ge 1 ]] && srcext="$1"
[[ "$#" -gt 2 ]] && dstext="$2" dir="$3" || dir="${2:-.}"
local bname=''
for f in "${dir}"/**/*"${srcext}"; do
bname="${f%${srcext}}"
echo "${bname}{${srcext} → ${dstext}}"
mv "${f}" "${bname}${dstext}"
done
}
Использование:
chgext
chgext src
chgext src dir
chgext src dst dir
Where `src` is the extension to find (default: ".old")
`dst` is the extension to replace with (default: "")
`dir` is the directory to act on (default: ".")
Для подпапок:
for i in `find myfolder -type d`; do
rename .old .new $i/*.old
done
В Fish вы можете сделать
for file in *.old
touch (basename "$file" .old).new
end