web-dev-qa-db-ja.com

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

拡張子が「.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...)
16
DiogoSaraiva

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

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

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

DebianベースのPerl、rename、Ubuntuなど。 prename manual を参照してください。

Util-Linux rename on Redhatなど。参照: rename manual

Debianなどでは、次のことができます。

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

または:

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

Redhatなどでは、次のことができます。

rename .old "" *
6
bdsl

http://file-folder-ren.sourceforge.net/ のような複数の名前変更ツールがたくさんあります

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

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

エラーチェックは行われず、ターゲットファイルが存在する場合は上書きされる可能性があることに注意してください。

3
Zaboj Campula

Zshを使用して、まず zmv 関数をロードします

autoload zmv

(これは.zshrc)次に実行します

zmv -w '*.old' '$1'

または

zmv '(*).old' '$1'

(名前変更ツールを使用するのではなく)シェル(Bash)プログラミングへの回答を制限したい場合は、次のことを試してください。

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を引用符で囲んでいます。

1
waltinator