これが取引です。ガールフレンドは、すべての写真を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
#!/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
最終的なファイル名は柔軟であり、これらは最新のスマートフォンからの写真であるため、exiftool
を使用して写真を自動的に整理して名前を変更することをお勧めします。
~/Pictures/iPhone
をコピー/バックアップして、必要に応じていつでも頼りにできるものを用意します。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
すべてを1行で使用できます。
find -name '*.JPG' | awk 'BEGIN{ i=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, i++ }'| bash
たとえば、/ Picturesフォルダから使用します。すべてのJPGファイルを検索すると、awkパイプがソースを取得し、4桁のカウンターでそれを増やします。このパイプをbashするために送ります
たとえばこれを持っている
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
チェックのためのエコー。実際に削除するために削除してください。