ディレクトリ内のすべてのファイルから特定の拡張子を削除します。 [重複]

ディレクトリ内のすべてのファイルから特定の拡張子を削除します。 [重複]

拡張子が「.old」のファイルが複数あります。
ファイルを削除せずに ".old"拡張子を削除するにはどうすればよいですか?

手動で行うこともできますが、より多くの作業が必要です。

mv file1.key.old file1.key
mv file2.pub.old file2.pub
mv file3.jpg.old file3.jpg
mv file4.jpg.old file4.jpg

(etc...)

このコマンドは他の拡張機能にも使用できますか?

例:

mv file1.MOV.mov file1.MOV
mv file2.MOV.mov file2.MOV
mv file3.MOV.mov file3.MOV

(etc...)

またはより良い:

mv file1.MOV.mov file1.mov
mv file2.MOV.mov file2.mov
mv file3.MOV.mov file3.mov

(etc...)

答え1

使用bashパラメータ置換メカニズム一致するサフィックスパターンを削除します。

for file in *.old; do
    mv -- "$file" "${file%%.old}"
done

答え2

使用しているオペレーティングシステムを指定していませんが、多くのLinuxディストリビューションにはrenameこの目的に使用できるコマンドがあります。実際には全く異なる2つのコマンドがありますrename。 Debian と同様のシステムは 1 つのコマンドを提供し、RedHat と同様のシステムは別のコマンドを提供しますが、ここではどちらか一方が機能します。

renameDebian、Ubuntuなどに基づくPerlについては、以下を参照してください。名前の本

renameRedhatなどのUtil-Linuxについては、以下を参照してください。マニュアルの名前変更

Debian と同様のシステムでは、次のことができます。

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

または:

rename s/.MOV.mov/.mov/ *.*

Redhat と同様のプラットフォームでは、次のことができます。

rename .old "" *

答え3

次のようなさまざまな名前変更ツールがあります。http://file-folder-ren.sourceforge.net/

しかし、名前を変更する最速の方法は、次の簡単なスクリプトだと思います。

for i in *.old
do
   mv -- "$i" "${i%.old}"
done

エラーチェックはなく、ターゲットファイルがある場合は上書きできます。

答え4

名前変更ツールを使用するのではなく、シェルプログラミングに回答を制限するには、次のようにします。

for oldname in *.old ; do
    newname="${oldname%%.old}"
    if [ -e "$newname" ] ; then
        echo "Cannot rename $oldname because $newname exists." >&2
    else
        mv -- "$oldname" "$newname"
    fi
done

$oldname$newnameファイル名にスペースを含めることができるため、引用符を使用してください。

関連情報