web-dev-qa-db-ja.com

すべて5003.jpgという名前の何百もの.jpgファイルの移動と名前の変更

これが取引です。ガールフレンドは、すべての写真をiPhoneからラップトップ(Ubuntu 14.04を実行している)に転送することを望んでいます。これを実行しようとした専用プログラムがすべて機能しなかったため、彼女のiPhone上のすべての写真を含むDCIM /フォルダー全体をコピーしました。私の苦境は、DCIM /が4つのフォルダーに分割され、そのフォルダーに彼女の写真ごとに個別のフォルダーが含まれることです。これらの各フォルダでは、すべての画像に同じ名前「5003.jpg」が付いています。

コマンドラインを使用して、これらすべてのファイルを1つのフォルダー(〜/ Pictures/iPhone /など)に移動して名前を変更したい(おそらく、0001.jpg、0002.jpgなどの昇順の数値名を使用)。

これまでのところ、私が何とかしてきたのは、各ファイルのすべての個別パスのテキストファイルをコンパイルすることだけです。

パス名の例:

/home/jennie/Pictures/DCIM/101Apple/IMG_1703.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1431.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1933.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1388.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1954.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1524.JPG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1897.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1582.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1007.PNG/5003.JPG
/home/jennie/Pictures/DCIM/101Apple/IMG_1502.JPG/5003.JPG
2
user151768
#!/bin/bash

appledir="$HOME/Pictures/DCIM/101Apple"
jpgname="5003.JPG"

for   dir   in "$appledir"/*
do    if    [[ -d "$dir" ]]
      then
          newfile="$appledir/${dir##*/}"
          mv "$dir"/5003.JPG "$newfile.tmp" &&
          rmdir "$dir" &&
          mv "$newfile.tmp" "$newfile"
      fi
done

このような初期ツリーの場合:

$ tree Pictures/
Pictures/
└── DCIM
    └── 101Apple
        ├── IMG_1002.JPG
        │   └── 5003.JPG
        ├── IMG_1003.JPG
        │   └── 5003.JPG
        └── IMG_1004.JPG
            └── 5003.JPG

スクリプト(./script.sh)を実行すると、次のツリーになります。

$ tree Pictures/
Pictures/
└── DCIM
    └── 101Apple
        ├── IMG_1002.JPG
        ├── IMG_1003.JPG
        └── IMG_1004.JPG

編集:

*.PNGファイルの名前を*.JPGに戻すには、次を使用します。

for     name   in "$HOME/Pictures/DCIM/101Apple"/*.PNG
do      mv -i "$name" "${name%PNG}JPG"
done
2
user79743

最終的なファイル名は柔軟であり、これらは最新のスマートフォンからの写真であるため、exiftoolを使用して写真を自動的に整理して名前を変更することをお勧めします。

  1. まず、~/Pictures/iPhoneをコピー/バックアップして、必要に応じていつでも頼りにできるものを用意します。
  2. コマンドでexiftoolを実行します。次のオプションを使用してプロンプトを表示します。
$ exiftool -P -r '-FileName<DateTimeOriginal' -d ~/outdir/%Y-%m-%d/%H/%Y-%m-%d_%H.%M.%S.%%e ~/Pictures/iPhone

これにより、~/Pictures/iPhoneが空になり、iPhoneが各写真に自動的に埋め込んだEXIFタイムスタンプデータに基づいて、新しく生成された~/outdirディレクトリに再編成して名前が変更されます。結果のディレクトリパスとイメージファイル名は次のようになります。

 ~/outdir/2016-01-03/10/2016-01-03_10.38.58.jpg

インストール

exiftoolがない場合は、

$ Sudo apt-get install libimage-exiftool-Perl

オプション

  • '-FileName<DateTimeOriginal'はリテラルであり、引数の一部です
  • -dは宛先テンプレートを指定します。たとえば、~/outdirを任意の別のパスに変更できます。
  • 現在、%H/部分は、各日付ディレクトリ内に1時間あたりのサブディレクトリをさらに作成する部分です。このような時間ごとのサブディレクトリを使用したくない場合は、次のように時間の部分を省略できます。~/outdir/%Y-%m-%d/%Y-%m-%d_%H.%M.%S.%%e
  • または、日付ごとのディレクトリも必要ない場合は、~/outdirに直接画像が必要な場合は、日付ディレクトリの部分を省略して、次のようにすることができます。~/outdir/%Y-%m-%d_%H.%M.%S.%%e
3
clarity123

すべてを1行で使用できます。

find -name '*.JPG' | awk 'BEGIN{ i=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, i++ }'| bash 

たとえば、/ Picturesフォルダから使用します。すべてのJPGファイルを検索すると、awkパイプがソースを取得し、4桁のカウンターでそれを増やします。このパイプをbashするために送ります

1
Jesus Cepeda

たとえばこれを持っている

cat list-of-files
path1/file1
path2/file1

私たちはそれができる。毎回a変数をリセットする方がよい:

a=0; cat list-of-files |  while read -r f; do
  echo mv -v "$f" $((++a)).jpg
done 
mv -v path1/file1 1.jpg
mv -v path2/file1 2.jpg

チェックのためのエコー。実際に削除するために削除してください。

0
Jshura