web-dev-qa-db-ja.com

Linux:複数のファイルのファイル拡張子を削除する

拡張子が.txtのファイルがたくさんあります。 Linuxで複数のファイルの.txt拡張子を削除するにはどうすればよいですか?

見つけた

rename .old .new *.old

置換.old拡張子.new

また、サブフォルダー内のファイルに対してもこれを行いたいです。

43
rp101

renameは少し危険です。これは、 マニュアルページ によると:

renameは、firstの出現を置き換えることにより、指定されたファイルの名前を変更します...

c.txt.parser.yのようなファイル名で間違って間違った動作をします。

findbashを使用したソリューションは次のとおりです。

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
69
thkala

私はこれを使用します:

find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \;
20
Chris Cowan

Perlバージョンのrenameは、次のように拡張子を削除できます。

rename 's/\.txt$//' *.txt

これは、サブフォルダーも実行するために、findと組み合わせることができます。

13
Andrew S

空の文字列を引数として明示的に渡すことができます。

rename .old '' *.old

そして、サブフォルダーで、find . -type d -exec rename .old '' {}/*.old \;{}は、findで見つかったエントリの代替であり、\;は、-execの後に指定されたコマンドの引数リストを終了します。

11
robert

それが役立つ場合、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: ".")
3
svvac

フィッシュでは、次のことができます

for file in *.old
      touch (basename "$file" .old).new
end
1
Bruno Alano

サブフォルダーの場合:

for i in `find myfolder -type d`; do
  rename .old .new $i/*.old
done
1
Konrad Garus

bash linuxで実行する

for i in *;do mv ${i} ${i/%.pdf/} ;done
0
shahin aref