拡張子が.txtのファイルがたくさんあります。 Linuxで複数のファイルの.txt拡張子を削除するにはどうすればよいですか?
見つけた
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がある場合、これはより確実なソリューションです。
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は、次のように拡張子を削除できます。
rename 's/\.txt$//' *.txt
これは、サブフォルダーも実行するために、findと組み合わせることができます。
空の文字列を引数として明示的に渡すことができます。
rename .old '' *.old
そして、サブフォルダーで、find . -type d -exec rename .old '' {}/*.old \;
。 {}
は、find
で見つかったエントリの代替であり、\;
は、-exec
の後に指定されたコマンドの引数リストを終了します。
それが役立つ場合、zshでそれを行う方法は次のとおりです。
for f in ./**/*.old; do
mv "${f}" "${f%.old}"
done
Zshの${x%pattern}
コンストラクトは、$x
の最後にあるpattern
の最短発生を削除します。ここでは、関数として抽象化されています。
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 file in *.old
touch (basename "$file" .old).new
end
サブフォルダーの場合:
for i in `find myfolder -type d`; do
rename .old .new $i/*.old
done
bash linuxで実行する
for i in *;do mv ${i} ${i/%.pdf/} ;done