13

私は名前の変更に精通していますが、重複した拡張機能を削除するために名前の変更が引き続き適用されることに興味がありました??

次の名前のファイルがいくつかあるとします。

  • 写真2.jpg.jpg
  • 写真9.jpg.jpg
  • 写真3.jpg.jpg
  • 写真6.jpg.jpg

重複した拡張子をどのように削除しますか??

最終結果:

  • 写真2.jpg
  • 写真9.jpg
  • 写真3.jpg
  • 写真6.jpg
4

3 に答える 3

19

仮定:

  • 現在の作業ディレクトリでのみこれを実行する必要があります(非再帰的に)
  • 二重拡張は、次のように正確にフォーマットされ.jpg.jpgます。

次に、次のスクリプトが機能します。

#!/bin/bash

for file in *.jpg.jpg
do
    mv "${file}" "${file%.jpg}"
done

説明:

このスクリプトを使用するには:

  • clean_de.shそのディレクトリに呼び出される新しいファイルを作成します
  • によって実行可能に設定しますchmod +x clean_de.sh
  • 次に、それを実行します./clean_de.sh

警告の注記

@gniourf_gniourfが指摘しているように、サポートしている-n場合はこのオプションを使用してください。mv

それ以外の場合-同じディレクトリにある場合は、名前が変更a.jpgされ、プロセス中に警告なしに既存のディレクトリが上書きされます。a.jpg.jpga.jpg.jpga.jpga.jpg

于 2012-11-23T20:33:30.657 に答える
4

1行の名前変更コマンドでも十分です(少なくともあなたの場合):

rename 's/\.jpg\.jpg$/.jpg/' *.jpg.jpg
于 2012-11-24T08:07:52.140 に答える
1

これは、より一般的ですが、この問題に対する簡単な解決策です。

for oldName in `find . -name "*.*.*"`; do newName=`echo $oldName | rev | cut -f2- -d'.' | rev`; mv $oldName $newName; done

簡単な説明:
find . -name "*.*.*- これにより、拡張子が重複するファイルのみが再帰的に検索されます

echo $oldName | rev | cut -f2- -d'.' | rev- ここでトリックが発生します。rev コマンドは文字列を逆に処理するため、最初のドットからファイル名全体が必要であることがわかります。(gpj.gpj.fdsa)

mv $oldName $newName- 実際にファイルの名前を変更する

リリース ノート: 1 行の単純なスクリプトであるため、未処理のケースを見つけることができます。ファイル名に余分なドットがあるファイル、非常に深いディレクトリ構造など。

于 2012-11-24T09:38:26.357 に答える