CSVファイルに基づいてファイル(画像)の名前を一括変更する方法


11

私が持っているものと達成したいもの:

  1. 1つのフォルダーに数千の画像があります。

  2. 次の列を含むCSVファイルがあります。

    A:元の名前B:名前の変更

    典型的な行は次のようになります。

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    引用符を削除しても問題ありません。

  3. 次に、アプリを使用するか、列Aのすべての画像を検索し、列Bの名前に変更するスクリプトを実行します(たとえば、original-1.jpg-> renamed-1.jpg)。

周りにいくつかの答えがあります。例えば:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

ただし、いくつかのスクリプティングが関係しており、これらのすべてのスクリプトがスクリプトを保存するフォルダーにのみ影響するのか、特定の条件を満たすディスク上のすべてのファイルの名前を変更できるのかはわかりません。もちろん、後者は避ける必要があります。

私が探しているのは、ファイルの名前を変更する方法と、ファイルを含むフォルダを選択する方法の簡単なガイドです。

前もって感謝します。

回答:


13

これはあなたのために働くはずです:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

説明:

  • sed 's/"//g' files.csv :引用符を削除する
  • IFS=, :入力を分割します ,
  • while read orig new; do ... done:これは各入力行を読み取り、$IFS(ここではコンマ)の値で分割し、1番目のフィールドをとして保存し$orig、残りをとして保存し$newます。
  • mv "$orig" "$new" :これにより、要求に応じてファイルの名前が変更されます。

ファイルにファイル名(などorig.jpg)のみが含まれ、パス(ない、/home/take2/orig.jpgまたは同様)が含まれていない場合、上記のコマンドは現在のディレクトリ内のファイルにのみ影響します。そのため、ターミナルcdをターゲットディレクトリに開いて実行する必要があります。

最初にテストする:

これをテストするには、実際にコマンドを実行せずに実行されるコマンドを印刷することにより、最初にドライランを実行できます。

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 

すばらしい、これはよりよく説明されます。:)実行する前に確認する-ターゲットディレクトリにcdしてこの行を実行するか、その行をexample.shとして保存してから端末から "example.sh"を実行する必要がありますか?
take2 14年

@ take2を使用すると、行を直接実行できます。実際にファイルを変更せずに何が実行されるかを確認する方法で回答を更新しました。最初にそれを行うことをお勧めします。
14年

素晴らしい、うまくいく!もう1つ-列のラベルが何であるか(現時点では "orig"と "new")、または列Aの名前を列Bの名前に変更しますか?
take2 14年

@ take2ラベル いいえ、最初のコンマ区切りフィールドを取得し、2番目のフィールドに名前を変更します。3つ以上のフィールドがある場合、行の残りの部分に名前が変更されることに注意してください。入力ファイルが投稿したものと同じであれば、期待どおりに機能します。
テルドン14年

ところで ターミナルには、「mv:stat 'orig':No such file or directory」も表示されますが、ファイルの名前は変更されました。
take2 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.