場合によっては、PC 上で反復的なタスクを実行する必要がありますが、時間の経過とともに退屈になります。 場合によっては、適切に機能するスクリプトを使用することで作業を容易にすることができます。
今日は、デジタル カメラの新しい画像を SD カードから PC にコピーするというニーズを解決する bash スクリプトを紹介するために書いています。
状況:
新しいイメージをコンピュータにダウンロードするたびに、次の手順を実行していました。
1. 画像がサブディレクトリに分類されているディレクトリを開きます。
2. 現在の日付の名前を付けて、yy.mm.dd 形式で新しいサブディレクトリを作成します。
3. 前回作成したサブディレクトリに移動し、最後に保存された画像が何であるかを確認します。
4. 新しいイメージを SD カードから新しく作成したディレクトリにコピーします。
XNUMX分もかかりませんが、カードを挿入するだけで完了するほうが楽です。
解決策:
次の処理を行う bash スクリプトを作成します。
1. 起動時にSDカードがマウントされているかどうかを確認します。 それ以外の場合は終了します。
2. イメージのメイン ディレクトリに移動し、最後のイメージを探します。 その名前を変数に保存します。
3. 現在の日付と最後のディレクトリを比較し、異なる場合は、現在の日付の名前を「yy.mm.dd」形式で新しいディレクトリを作成します。
4. 最後のディレクトリ (新しいディレクトリではなく古いディレクトリ) に移動し、前回転送した最後のファイルの名前を変数に保存します。
このステップでは、カード上の新しいファイルとすぐに比較できるように、ファイル名をフィルタリングする必要があります。 ファイルの形式は次のとおりです。 XXX_xxxx.eee ここで、 x = 0 ~ 9 の数字、 eee = 拡張子 (JPG、MOV)。 例: 100_5684.JPG、100_5699.MOV。 フィルター後、名前は xxxxxxx のままになります。 したがって、上記の例では、1005684、1005699 となります。
ディレクトリには他の種類のファイル、または名前が変更されたファイルが含まれる可能性があるため、フィルタが使用されます。
5. カードに移動し、前のポイントと同様にファイルをフィルタリングします。
6. カード上のファイルと、前回転送された最後のファイルを含む変数を比較し (ポイント 4)、指定されたファイルを新しく作成したディレクトリにコピーします。 変数より大きい。 (名前は単なる数字であるため)。
7. ファイル マネージャーを使用して、新しいイメージが含まれるディレクトリを開きます。
以下に、スクリプトがどのように機能するかを説明するコメントを付けて示します。 私はプログラマではないことを明確にします。特に「for」ループの名前をフィルタリングする必要があるときは、それを機能させるまで何度か頭痛の種になりました。
#!/bin/bash ### --- SD がマウントされているかどうかを確認してください --- ### SD=/media/KODAK/DCIM/100Z8612 if [[ -d $SD ]]; 次に ### --- CREATE DIRECTORY --- ### #画像ディレクトリを読み取り、現在の #日付の名前と権限 755 を使用して別のディレクトリを作成します (存在しない場合)。 cd ~/Images/kodak ULTDIR=`ls -1 | tail -n1` # リストされた最後のディレクトリ。 DATE=`日付 +%y.%m.%d` #YY.MM.DD 形式の現在の日付 if [ "$LASTDIR" != "$DATE" ]; 次に mkdir -vm 755`date +%y.%m.%d`# 現在の日付でディレクトリを作成します fi ### --- $ULTDIR からの最後のファイルを表示 --- ### cd $ULTDIR ULTIMG=`ls - 1 [0-9][0-9][0-9]_[0-9][0-9][0-9][0-9].[JM][PO][GV] | 尾-n1 | Cut -c1-3,5-8` # xxx_XXXX.eee という名前の最後の画像を表示します。 .eee = ファイル拡張子 (JPG または MOV) # 一致後にスクリプトが動作することを確認するには: # 100_9999.eee -- > 101_0000.eeeエラーはありません # xxxXXXX 形式に切り取ります ### --- リストされた最後のディレクトリに移動 --- ### # または、作成された場合は最近作成されたディレクトリ # cd .. LASTDIR= `ls -1 | tail -n1` # 再度実行します。そうでない場合は、if cd /media/KODAK/DCIM/100Z8612 から前の ULTDIR を取得します。 ### --- SD 上のファイルをフィルタ処理します --- ### FILTER=`ls -1 [0 -9][ 0-9][0-9]_[0-9][0-9][0-9][0-9].[JM][PO][GV]` ### -- - 新しいファイルを比較最後より大きい名前 --- ### for I in $FILTER do N=`echo $I | Cut -c1-3,5-8` #名前をカット if [[ "$ULTIMG" -lt "$N" ]]; then cp $I ~/Images/kodak/$ULTDIR fi 完了 thunar ~/Images/kodak/$ULTDIR #Thunar で新しいディレクトリを開きます else exit 0 fi exit 0
最後に、それを機能させるために、メニューのXfceの「リムーバブルドライブとメディア」アプリに追加しました。
設定 → Xfce 4 設定マネージャー → リムーバブルドライブとメディア → カメラ
画像インポートオプションを使用します。 カードを挿入すると、画像をインポートするかどうかを尋ねるダイアログ ボックスが表示されます。 受け入れられると、スクリプトが実行されます。
それで終わりです。 乱雑なテキストで申し訳ありませんが、これは私の最初の投稿であり、編集時にスクリプトを表にまとめる方法がわかりません。 少なくとも誰かがアイデアを持ち、それをそれぞれの特定のケースに適応させるのに役立つことを願っています。
とても興味深いですね、ホアキンさん、コードを共有しやすい場所にスクリプトをペーストしてアップロードするのが良いアイデアです。あなたが言うように、他のニーズにも適応でき、bash の使い方をもう少し学ぶことができます。
ご挨拶!
完了、追加しました http://paste.desdelinux.net/4737
ありがとうございます!
ディレクトリにすでにある写真をコピーするとき、すでに写真があることが通知され、それを置き換えるかコピーしないかのオプションが表示されませんか?
とにかく全てを自動でやってくれるのでとても便利です
こんにちは。 実際には繰り返し画像をコピーするのではなく、無視するだけです。 このアイデアはまさに、ユーザーの介入を必要とせずに新しいファイルをコピーすることでした。 また、XNUMX 日に複数回イメージを追加しない限り、スクリプトは新しいファイルを新しいディレクトリにコピーします。 簡潔に説明します:
今日は 10/03/13 です。13.03.10 というディレクトリを作成し、そこに画像またはビデオ (MOV) をコピーします: 100_4440.JPG、100_4441.JPG、100_4442.MOV、100_4445.JPG
(欠けている 4443 と 4444 はカメラで消去されました。最後のものは 4445 です)。
次に、01/04/13 にスクリプトを使用し、カードに新しいイメージがあるとします。 このスクリプトは、13.04.01 という名前のディレクトリを作成し、その中に「4445」より大きい名前の新しい画像/ビデオを作成します。 13.03.10 ディレクトリを読み取り、最後のイメージが 100_4445.JPG であるためです。 同じ日に新しいカード イメージを使用してスクリプトを再度実行すると、それらは 13.04.01 ディレクトリに追加されます。 どれも上書きされません。
私の考えが少し明確になったと思います :
Rapid Photo Downloader をご存知ですか? それ以上のことができると思います。
問題は、スキニーがそれを自分でやったということです、彼は楽しんでいただろうと思います、そしてそれは他の誰かにとって役立つかもしれません
こんにちは。 私はそれを知りませんでしたし、インターネットで見た限りでは良さそうですが、実際には、このスクリプトは私が必要とするものを完全に満たしています。 これは、カードを挿入すると、すべてのファイルが自動的にコピーされます。
また、最初はうまくいかなかったのは明らかだったので、もう少し学ぶのにも役立ちました。 間違いは起こりましたが、そこから多くのことを学ぶことができます。
他の人をトラブルシューティングするためのスクリプトを紹介するつもりはありませんでした。あなたが言及したような、より一般的なアプリがあります。 あなたが読んで、ループ (この場合は「for」) と正規表現 (スクリプト内の「ULTIMG」および「FILTER」変数) を使用して新しいものを作成するためのリファレンスとして、これを共有しました。
便利そうなので、いつか必要になったときのために保管しておきます。 ありがとう。
ありがとうございます!
しかし、そのためにはすでに grsync があります
はい、でも rsync はバックアップによく使われると思います。 私は見たことがありませんが、これは私たち全員が考慮し、使い方を学ぶ必要があるアプリケーションです。
rsync 用のグラフィカル インターフェイスがあるとは知りませんでした。
うわー、このコードは非常に興味深く、非常に便利だと思います。 それを維持する。 😀
必要な場合に備えて保管しておきます。
ご挨拶。
ありがとうございました!。