Linuxカメラマンのコマンドラむンが廃止されたした

Change-8M以来、私は写真が奜きです。 その埌、金曜日たたは土曜日に長い期埅があり通垞、プレスは週末の倜に行われたした、それ以前にはフィルム、化孊薬品、写真甚玙に非垞に長い期埅がありたした䞍足があったため。 今、私は成長し、倧きくお怠け者になりたした。 私の石鹞箱はほずんどい぀も私ず䞀緒にいたすバックパックの䞭か、私のポケットの䞭のどこかに。 私は興味を起こさせたすべおを撮圱したす。 同時に、1日に1枚の写真があり仕事から出かけた、䞀床にたくさんの写真がありたす意図的に散歩に出かけた。 そしお、意図的なケヌスでは、家に垰ったずきに塩を遞別する可胜性が高く、孀立したケヌスでは忘れおしたい、その埌、数十の異なる日に撮圱した写真を遞別する必芁がありたす。 最近、意図的に倖に出るこずが次第に少なくなったため、1枚の写真の数が増えたした。 そしお、 昚幎の蚘事に觊発されたこれらの日のいずれかで、私は趣味を簡玠化するこずにしたした。 LinuxはコンピュヌタヌopenSUSE 12.1にむンストヌルされおいるため、解決できない問題はないはずです。 そしお、私はそれが自分自身をコピヌしお、どこにでも突く必芁がないこずを望みたした。 たあ、私は停造Linuxoidなので最初ず最埌のスクリプトは0x0C幎前の3幎目にありたした、すぐにうたくいかなかったず蚀いたす。



「2009.05.20 Night Peter」、「2011.08.20 Lavna Falls」、「2012.07.24 Dusya is sleeping。」の写真が1枚ある堎合でも、写真を1か所に保管したす。 少なくずももう1レベル-1幎は必芁だが、ただ耐えるこずができるずいう考えがすでに来おいたす。 私の写真集合旅行の堎合-それは私にずっお重芁ではありたせん、すべおがむベントの同じカタログにありたす。 必芁に応じお、ペンで写真を芋぀けたす。

自動䞊べ替えを行うには、目的のメモリカヌドを接続した瞬間を远跡しお、䞊べ替えスクリプトを実行する必芁がありたす。 Linuxでは、udevデヌモンがハヌドりェアを担圓したす。 したがっお、最初に、その凊理方法を孊習したす。



udev
udevはハヌドりェアを監芖し、デバむスごずに/ devディレクトリに独自のノヌドを䜜成したす。 これは䟿利ですが、わずかなニュアンスがありたす。同じクラスのデバむスには、接続されおいる順序に応じお順番に名前が付けられたす。 したがっお、最初のオプション-必芁に応じおすべおをコピヌするスクリプトのボタンを抌す-は適合したせん他のドラむブが接続されおいるこずはわかりたせんが、特定のドラむブを远跡するにはスクリプトを耇雑にする必芁があり、カヌドを接続した埌にどこかで刈り取りたくありたせんでした 。 ただし、特定のドラむブが目的のポむントにマりントされるように構成するこずができたす-これは適切ですが、十分ではありたせん。 その最倧のプラスフィルタヌに適したいく぀かのむベントのための任意のスクリプトの起動。 最初に、メモリカヌドをカヌドリヌダヌに挿入したこずを䞀意に刀断するために、どの属性ずむベントをアタッチできるかを芋おみたしょう。 このセクションの最終目暙は、カヌドリヌダヌudevルヌルファむルです。

デバむスの特性を衚瀺するには、udevadmプログラムを䜿甚できたす。 しかし、圌女にはデバむス名が必芁です。 したがっお、最初にカヌドリヌダヌでディスクの名前を確認する必芁がありたす。 最も簡単な方法を䜿甚したす。 最初に、システムにすでにあるドラむブを確認したす。

>ls -1 /dev/sd* /dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdc /dev/sdc1 /dev/sdd /dev/sdd1 /dev/sde /dev/sde1 /dev/sdf /dev/sdg /dev/sdh /dev/sdi
      
      





カヌドをリヌダヌに挿入しお、コマンドを繰り返したす。

 >ls -1 /dev/sd* /dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdc /dev/sdc1 /dev/sdd /dev/sdd1 /dev/sde /dev/sde1 /dev/sdf /dev/sdg /dev/sdh /dev/sdh1 /dev/sdi
      
      





挿入されたカヌドは、名前/ dev / sdh1の䞋に隠れおいるこずがわかりたす。 秘密ずしお、最埌の4぀のディスクsdf、sdg、sdh、sdiはすべおカヌドリヌダヌであり、メモリカヌドがなくおもリヌダヌをコンピュヌタヌに接続する前埌に同じコマンドを実行するこずでディスクを刀別できたす埌で説明した方法で圌がすでにボリュヌム名を決定したずきに来たした。



次に、このカヌドリヌダヌずカヌドの特性を芋おみたしょう。 リヌダヌ内のカヌドの倖芳の事実の倚かれ少なかれ明癜な決定に固執するこずが可胜なものを芋぀けるこずが必芁です。 ここでは、圌のディスク名が必芁になりたす。 このコマンドは、指定された名前からルヌトたでのすべおのデバむスの属性を、udevのような圢匏でリストしたす。

Udevadmの出力
 >udevadm info -a -n /dev/sdh1 Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host10/target10:0:0/10:0:0:2/block/sdh/sdh1': KERNEL=="sdh1" SUBSYSTEM=="block" DRIVER=="" ATTR{partition}=="1" ATTR{start}=="2048" ATTR{size}=="153600" ATTR{ro}=="0" ATTR{alignment_offset}=="0" ATTR{discard_alignment}=="0" ATTR{stat}==" 146 4 738 319 0 0 0 0 0 319 319" ATTR{inflight}==" 0 0" looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host10/target10:0:0/10:0:0:2/block/sdh': KERNELS=="sdh" SUBSYSTEMS=="block" DRIVERS=="" ATTRS{range}=="16" ATTRS{ext_range}=="256" ATTRS{removable}=="1" ATTRS{ro}=="0" ATTRS{size}=="7745536" ATTRS{alignment_offset}=="0" ATTRS{discard_alignment}=="0" ATTRS{capability}=="51" ATTRS{stat}==" 1352 1239 73856 8882 4 18 22 735 0 3608 9615" ATTRS{inflight}==" 0 0" ATTRS{events}=="media_change" ATTRS{events_async}=="" ATTRS{events_poll_msecs}=="-1" looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host14/target14:0:0/14:0:0:2': KERNELS=="14:0:0:2" SUBSYSTEMS=="scsi" DRIVERS=="sd" ATTRS{device_blocked}=="0" ATTRS{type}=="0" ATTRS{scsi_level}=="0" ATTRS{vendor}=="Generic-" ATTRS{model}=="SD/MMC " ATTRS{rev}=="1.00" ATTRS{state}=="running" ATTRS{timeout}=="30" ATTRS{iocounterbits}=="32" ATTRS{iorequest_cnt}=="0x220" ATTRS{iodone_cnt}=="0x220" ATTRS{ioerr_cnt}=="0x21f" ATTRS{evt_media_change}=="0" ATTRS{queue_depth}=="1" ATTRS{queue_type}=="none" ATTRS{max_sectors}=="240" looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host14/target14:0:0': KERNELS=="target14:0:0" SUBSYSTEMS=="scsi" DRIVERS=="" looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0/host14': KERNELS=="host14" SUBSYSTEMS=="scsi" DRIVERS=="" looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1:1.0': KERNELS=="1-1:1.0" SUBSYSTEMS=="usb" DRIVERS=="usb-storage" ATTRS{bInterfaceNumber}=="00" ATTRS{bAlternateSetting}==" 0" ATTRS{bNumEndpoints}=="02" ATTRS{bInterfaceClass}=="08" ATTRS{bInterfaceSubClass}=="06" ATTRS{bInterfaceProtocol}=="50" ATTRS{supports_autosuspend}=="1" ATTRS{interface}=="Bulk-In, Bulk-Out, Interface" looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1/1-1': KERNELS=="1-1" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="CARD READER" ATTRS{bNumInterfaces}==" 1" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="80" ATTRS{bMaxPower}=="500mA" ATTRS{urbnum}=="10885" ATTRS{idVendor}=="0bda" ATTRS{idProduct}=="0151" ATTRS{bcdDevice}=="5195" ATTRS{bDeviceClass}=="00" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{speed}=="480" ATTRS{busnum}=="1" ATTRS{devnum}=="15" ATTRS{devpath}=="1" ATTRS{version}==" 2.00" ATTRS{maxchild}=="0" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{authorized}=="1" ATTRS{manufacturer}=="Generic" ATTRS{product}=="USB2.0-CRW" ATTRS{serial}=="20060413092100000" looking at parent device '/devices/pci0000:00/0000:00:02.1/usb1': KERNELS=="usb1" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="" ATTRS{bNumInterfaces}==" 1" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="e0" ATTRS{bMaxPower}==" 0mA" ATTRS{urbnum}=="222" ATTRS{idVendor}=="1d6b" ATTRS{idProduct}=="0002" ATTRS{bcdDevice}=="0301" ATTRS{bDeviceClass}=="09" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="64" ATTRS{speed}=="480" ATTRS{busnum}=="1" ATTRS{devnum}=="1" ATTRS{devpath}=="0" ATTRS{version}==" 2.00" ATTRS{maxchild}=="6" ATTRS{quirks}=="0x0" ATTRS{avoid_reset_quirk}=="0" ATTRS{authorized}=="1" ATTRS{manufacturer}=="Linux 3.1.10-1.16-desktop ehci_hcd" ATTRS{product}=="EHCI Host Controller" ATTRS{serial}=="0000:00:02.1" ATTRS{authorized_default}=="1" looking at parent device '/devices/pci0000:00/0000:00:02.1': KERNELS=="0000:00:02.1" SUBSYSTEMS=="pci" DRIVERS=="ehci_hcd" ATTRS{vendor}=="0x10de" ATTRS{device}=="0x077c" ATTRS{subsystem_vendor}=="0x1043" ATTRS{subsystem_device}=="0x82e7" ATTRS{class}=="0x0c0320" ATTRS{irq}=="22" ATTRS{local_cpus}=="00000000,00000000,00000000,0000000f" ATTRS{local_cpulist}=="0-3" ATTRS{numa_node}=="0" ATTRS{dma_mask_bits}=="32" ATTRS{consistent_dma_mask_bits}=="32" ATTRS{enable}=="1" ATTRS{broken_parity_status}=="0" ATTRS{msi_bus}=="" ATTRS{companion}=="" ATTRS{uframe_periodic_max}=="100" looking at parent device '/devices/pci0000:00': KERNELS=="pci0000:00" SUBSYSTEMS=="" DRIVERS==""
      
      





メモに曞かれおいるように、デバむス自䜓のプロパティず芪デバむスのいずれかのプロパティを䜿甚しお、ルヌルを䜜成できたす。



メモリカヌドの最初のセクションを接続するためのルヌルを蚘述したすパヌティションを䜜成せずにカヌドをすぐに切断するために、そうしたせんでした。たた、カメラは最初のセクションのみに曞き蟌みたす。 sdh1ボリュヌム自䜓には、倚くの固有のプロパティがありたせん。 ここで、おそらくデバむス名KERNEL == "sdh1"およびこのデバむスのサブシステムSUBSYSTEM == "block"。 ただし、フラッシュドラむブにはこのようなプロパティがありたす。 そしお、先ほど蚀ったように、次にシステムがボリュヌムsdh1を呌び出すのは事実ではなく、突然xD-PictureたたはCompactFlashを備えた別のカメラを賌入したすこれらはsdf、sdg、sdiになりたす-したくないこのルヌルを曞き盎しおください。 幞いなこずに、udevはゞョヌカヌをサポヌトしおいるため、ルヌルのこの郚分では、KERNEL ==“ sd1”たたは“ sd *”ずいう衚珟を䜿甚したす。これは、マップされたドラむブの最初のボリュヌムを意味し、どの特定の文字の䞋にあるかを瀺したす-したせん重芁なのは、スクリプトがゞョヌカヌなしで名前を完党に取埗するこずです。



次のデバむスに移りたしょう。 /devices/pci0000:00/0000:00:02.1/usb1/1-1/1/1-1:1.0/host14/target14pg_/14code_:2/block/sdhは新しく、蚘憶に残るでしょう。 、ATTRS {events} == "media_change"のみですが、この堎合もフラッシュドラむブにはこの属性がありたす。



次のデバむスは/devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1-1:1.0/host14/target14pg_/14_node::2であり、これはATTRS { model} ==“ SD / MMC”ですが、この属性にアタッチするず、SDカヌドにのみ応答し、メモリカヌドのその他の可胜なオプションは無芖されたす。 次の3぀のデバむスでは、再び興味深いものは芋぀かりたせん。 次のデバむス/devices/pci0000:00/0000:00:02.1/usb1/1-1はすでに興味深いものです。

 SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="CARD READER" ATTRS{idVendor}=="0bda" ATTRS{idProduct}=="0151" ATTRS{product}=="USB2.0-CRW" ATTRS{serial}=="20060413092100000"
      
      





属性から刀断するず、これはカヌドリヌダヌ自䜓であり、必芁です残りのデバむスは既にUSBバスに関連しおいたす。 党䜓ずしお、通信ルヌルでは、カヌドリヌダヌの属性ずメモリカヌドの最初のボリュヌムに䟝存したす。

 ACTION=="add", KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{configuration}=="CARD READER", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0151"
      
      





そしお、デバむスを远加する別のむベントACTION == "add"を挿入したした。 カヌドがリヌダヌから取り倖された埌のコピヌは、玔粋に物理的に䞍可胜です。 私は思ったただATTR属性{ro} ==“ 0”がありたす-ルヌルに远加するこずもできたす。そうでない堎合、ディスクが曞き蟌み保護されおいる堎合、䜕も移動できたせんただし、コピヌするこずは可胜ですが、わずかに散圚しおいる可胜性がありたすカメラのファむルタむプ名テンプレヌトに応じお䜙分なディレクトリがありたすが、私はただ自分で行いたせん。



おそらくお気づきでしょうが、キヌATTR / KERNEL / SUBSYSTEM / DRIVERはデバむス自䜓に䜿甚され、その芪にはすでに末尟にSずいう文字が付いおいたすATTRS / KERNELS / SUBSYSTEMS / DRIVERS。



microSDカヌド甚のリヌダヌがもう1぀あるため、構成に空の行があり、idVendorずidProductによっおのみバむンドできたす。 udevルヌルファむルの以前のバヌゞョンの1぀8月䞭旬にスクリプトの蚘述を開始し、10月たでシステムを曎新せず、この間隔のどこかにこの属性が远加され、䞀般的にこのリヌダヌの倚くの属性が倉曎されたしたベンダヌずデバむスの属性が䜿甚されたしたが、珟圚は特別な必芁はありたせんが、消えたずきにわずかに倉曎されおいたす。 このフィルタヌオプションでは、カヌドリヌダヌのこのモデルでのみ機胜し、他のモデルを接続しおも効果はありたせん。



フィルタを定矩したしたが、ただアクションを割り圓おおいたせん。 なぜなら 特定のスクリプトを実行する必芁がある堎合は、フィルタヌにアクションを远加したす。

 RUN+="/root/bin/PhotoSort.sh %k"
      
      





スクリプトパラメヌタのk-システムによっお生成されたボリュヌムの名前ディスクのKERNELキヌに衚瀺されるものはsdh1です。 /root/bin/PhotoSort.shは、将来のスクリプトの名前です。



udevの最終的なルヌルファむルは次のようになりたす。

 >cat /etc/udev/rules.d/99-lumix.rules #      ACTION=="add", KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{configuration}=="CARD READER", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0151", RUN+="/root/bin/PhotoSort.sh %k" #      #ACTION=="add", KERNEL=="sd?1", SUBSYSTEMS=="pci", ATTR{events}=="media_change", ATTRS{vendor}=="0x10de", ATTRS{device}=="0x077e", RUN+="/root/bin/PhotoSort.sh %k"
      
      





ここで、このテキストを/etc/udev/rules.d/ディレクトリルヌト暩限が必芁に任意の名前で保存したす99-lumix.rulesがありたす。 udevデヌモンは、条件に䞀臎するフィルタヌが芋぀かるたで、このディレクトリからのファむルをアルファベット順に凊理したす。 適切なルヌルを芋぀けた埌、ファむルのそれ以䞊の凊理は実行されたせん。 したがっお、ルヌルの数は小さく蚭定でき、より早く凊理され、他のルヌルによっおブロックされたせん。



接続されおいるすべおのフラッシュドラむブずカヌドを远跡する堎合は、リヌダヌ自䜓の1レベル䞋に傟き、SUBSYSTEMS ==“ usb”、DRIVERS ==“ usb-storage”にしがみ぀くこずができたす。 しかし、今のずころ、読者に埓うだけです-残りの必芁はありたせんでした。



バッシュ
そしお今、私たちは接続されたカヌドから写真を゜ヌトするスクリプトを曞いおいたす。 元のバヌゞョンでは、ディスク党䜓の゜ヌトのみがサポヌトされおいたした。 運甚䞭に、既存のディレクトリ蓄積された未゜ヌトも凊理したかったので、少し倉曎しお远加する必芁がありたした。 ここでは、ディスクずディレクトリの䞡方からメディアファむルメディアファむルの拡匵子はスクリプトのfindコマンドパラメヌタヌで指定されたすを䞊べ替えるこずができる2番目のバヌゞョンを怜蚎したす。



たず、このスクリプトのアルゎリズムに぀いお簡単に説明したす。 凊理するものボリュヌムたたはディレクトリを決定したす。 ボリュヌムの堎合は、最初にマりントする必芁がありマりントポむントが既に取埗されおおり、このスクリプトでのみ䜿甚されおいる堎合、スクリプトは䜜業を完了したす、最埌にアンマりントするこずを忘れないでください。 マりント埌、このカヌドの蚭定が保存されおいる隠し.PhotoSortファむルの存圚が確認されたす。 この䞍圚は、通垞のカヌドが挿入されたこずを瀺す信号ずしお機胜し、䜕もする必芁はありたせん。 このファむルでは、ディスクの名前ロギングのみに必芁-最埌の説明ず、暙準が適合しない堎合はファむルを保存するディレクトリを指定できたす携垯電話甚に別のストレヌゞを䜜成するこずを考えたした。 ゚クスポヌトディレクトリは、コマンドラむンたたはudevルヌルファむルでスクリプトの2番目のパラメヌタヌずしお指定するこずもできたす。



次に、指定されたディレクトリずサブディレクトリのすべおのメディアファむルカメラが以前は知らなかった異なるディレクトリに写真を保存するためは、䜜成された時間で゜ヌトする必芁がありたす。 萜ずし穎がありたすLinuxでは、ファむルが䜜成された時間などはありたせんが、ファむルぞの最埌のアクセスの時間しかありたせん。たた、画像を操䜜するずきに曎新されるため、信頌するこずはできたせん。 ファむル名も䞍可胜です。02.05で䜜成されたDSC08655.JPGは、29.04からMOV08554.MPGの埌に続き、19.04からP1170007.JPGの埌に凊理されたす。 この問題は、1぀のむベント別名「パヌティヌ」を撮圱したさたざたなメヌカヌの耇数のカメラがある堎合に特に深刻です。 EXIFは私たちの助けになりたす-特に、DateTimeOriginal属性ずCreateDate属性がありたすこれらの間にいく぀かの違いがありたす少なくずもビデオファむルには最初のファむルがなく、䜕らかの理由で読み取られなかった堎合、2番目のファむルが読み取られたす通垞の状況での属性は倉曎されたせん。 しかし、特定のディレクトリから開始し、これらの属性で゜ヌトされたすべおのネストされたディレクトリからファむルを読み取る方法がわからないため、すべおのファむルの名前がルヌプで倉曎されたすexiftool自䜓がこれを行うこずができたすが、ログ甚のルヌプを残したした、スナップショットたたはビデオを䜜成する時間を远加したす名前で埌でファむル名で時系列に䞊べ替えるこずができるように。



2番目のサむクルでは、ファむルをディレクトリに配垃したす。珟圚のファむルず前のファむルずの区切りが5時間5 * 60 * 60を超えるず、新しいディレクトリが䜜成されたす。これが、ファむルを時系列で䞊べ替えた理由です。 5時は倩井からの数字です。 あるむベントの写真がなかったので、ショットの間隔がこの時間よりも長くなりたした。 POI間の長い旅皋で小旅行がありたしたが、道路は5時間もかからず、もしそれ以䞊であれば、すでに別の郜垂でした。 別の日に通過する結婚匏や䌑日があり、日付は倉わりたしたが、むベントは同じたたでした。 したがっお、小さなブレヌクは前のファむルず同じディレクトリに保存されたす。 ディレクトリ名はYYYYMMDD_HHずしお蚭定されたす-クロック新しいむベントの最初のファむルから取埗は、同じ日の2぀のむベントのためにディレクトリ名に远加されたす。そうでない堎合、2日目に行くず同じディレクトリ名を取埗したすが、䜜成は倱敗したすが、さらに保存されたすファむルは同じディレクトリに実装されたす。



発生するすべおがログに曞き蟌たれたすこれがスクリプトの機胜を確認する方法です。たた、ファむルをディスクに戻すコマンドデバッグに圹立ちたした-ファむルの䞀郚を実行し、テストメディアファむルを叀い名前でマップに戻したした。 远加の凊理回転、瞮小、眲名-私は䜿甚したせん。ずにかく、それらを芋お、削陀しお、すべおを実行できたす写真に眲名を​​付けたせん。 これを実行できる堎所は、スクリプトテキストのコメントで瀺されたす。

スクリプト自䜓
 >cat /root/bin/PhotoSort.sh #!/bin/bash #/root/bin/PhotoSort.sh #requires: bash,coreutils,findutils,exiftool,sed,util-linux #cat /etc/udev/rules/99-lumix.rules ##      #ACTION=="add", KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{configuration}=="CARD READER", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="0151", RUN+="/root/bin/PhotoSort.sh %k" ##      ##ACTION=="add", KERNEL=="sd?1", SUBSYSTEMS=="pci", ATTR{events}=="media_change", ATTRS{vendor}=="0x10de", ATTRS{device}=="0x077e", RUN+="/root/bin/PhotoSort.sh %k" #      udev #udevadm info -a -p $(udeadm info -q path -n /dev/sd*)  udevadm info -a -n /dev/sd* #http://www.arccomm.ru/OpenSource/Dev/udev.html if [[ -z "$1" ]] then echo             , echo      echo $(basename "$0") Source [DestDir] echo Source -    ,    echo DestDir -  ,     echo   ,    echo   ,      .PhotoCopy echo             echo    -   \( \) echo : echo $(basename "$0") sdd1 -    /dev/sdd1. echo         sdd1     .PhotoCopy echo        echo $(basename "$0") . ~/Photo -     \(.\)       echo    ~/Photo/  exit 1 #    fi if [[ ${1:0:1} == "/" || ${1:0:1} == "." || ${1:0:1} == "~" ]] then #   if [[ -d "$1" ]] then disk="$1" else echo    exit 2 #     fi else #   #   dev="/dev/$1" if [[ ! -e "$dev" ]] then #   ,     (      ,   ) exit 0 fi #    disk="/mnt/photo" fi #    if [[ ! -z "$2" ]] then #     photo="$2" else photo="/mnt/temp/Photo" #  ,  fi sphoto="" #    #         photodir="" # -:         -  log="/var/log/photosort.log" #      lastfiletime=0 #     curfiletime=0 #   -  #export XAUTHORITY="/home/%username%/.Xauthority" #export DISPLAY=:0.0 #notify-send Photoes "FlashCard found" #     - ?  - ,         if [[ -n "$dev" ]] then grep -q "$disk" /etc/mtab if [[ $? -eq 0 ]] #     , grep  0 then #  -   echo "#=- $(date -u +%Y.%m.%d\ %T)    -=#" exit 10 #   ,    -   fi #  if [[ ! -d "$disk" ]] then #     - mkdir "$disk" &>>"$log" echo "#"    "$disk" >> "$log" fi mount -t vfat -o noatime,rw,noexec,users,iocharset=utf8 "$dev" "$disk" &>> "$log" if [[ ! -e "$disk"/.PhotoCopy ]] then #       ,    umount "$disk" &>> "$log" exit 0 #   ,       ,       fi # :      $2,         #  -   ( /dev)    (  root) sphoto=$(head -n1 "$disk"/.PhotoCopy) #           ,        if [[ ${sphoto:0:1} == "/" && -d "$sphoto" ]] then #    ,    ,   photo="$sphoto" fi sphoto=$(tail -n1 "$disk"/.PhotoCopy) #        echo $(date -u +%Y.%m.%d\ %T)    "$sphoto" >> "$log" else if [[ ! -z "$2" ]] then photo="$2" #    fi log="./PhotoSort.log" #      echo "#" $(date -u +%Y.%m.%d\ %T)    "$photo" >> "$log" echo cd $(pwd) >> "$log" #     ,            fi #       # NB!:     - ,     #   ,       , #    (     ) #    (     -  ) for file in $(find "$disk" -type f \( -name '*.JPG' -o -name '*.MOV' -o -name '*.MPG' -o -name '*.THM' -o -name '*.MP4' -o -name '*.AVI' \) -and -not -name '*_*' -and -not -name '* *') do # exiftool   : # Date/Time Original : 2011:07:30 15:35:52 #     20110730153552 curfiletime=$(exiftool -DateTimeOriginal "$file" | cut -d: -f2- | sed 's/[:\ ]//g') #    if [[ $curfiletime == "" ]] then curfiletime=$(exiftool -CreateDate "$file" | cut -d: -f2- | sed 's/[:\ ]//g') #    fi mv "$file" $(dirname "$file")/"$curfiletime"_$(basename "$file") &>> "$log" #  echo mv $(dirname "$file")/"$curfiletime"_$(basename "$file") "$file" >> "$log" #     done #      # (      ,       -  -     ,  ,  ) for file in $(find "$disk" -type f -name '*.JPG' -o -name '*.MOV' -o -name '*.MPG' -o -name '*.THM' -o -name '*.MP4' -o -name '*.AVI' | sort) do # exiftool  ,               ,     curfiletime=$(exiftool -DateTimeOriginal "$file" | sed -r 's/^.+: ([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\1-\2-\3 \4:\5:\6/g') if [[ $curfiletime == "" ]] then curfiletime=$(exiftool -CreateDate "$file" | sed -r 's/^.+: ([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\1-\2-\3 \4:\5:\6/g') fi curfiletime=$(date -d "$curfiletime" +%s) #       if (( $curfiletime - $lastfiletime > 5*60*60 )) #        : 5*60*60 ,           then photodir=$(date -d @$curfiletime +%Y.%m.%d_%H) #       if [[ ! -d "$photo"/"$photodir" ]] #    - then mkdir "$photo"/"$photodir" &>> "$log" chown nobody:users "$photo"/"$photodir" &>> "$log" chmod 0777 "$photo"/"$photodir" &>> "$log" echo "#" $(date -u +%Y.%m.%d\ %T)    "$photodir" >> "$log" fi lastfiletime="$curfiletime" fi echo "#" $(date -u +%Y.%m.%d\ %T)   "$file"  "$photo"/"$photodir"/$(basename "$file") >> "$log" echo copy "$photo"/"$photodir"/$(basename "$file") "$file" >> "$log" #        -  (/ , gps   ) mv "$file" "$photo"/"$photodir"/ &>> "$log" chown nobody:users "$photo"/"$photodir"/$(basename "$file") &>> "$log" chmod 0666 "$photo"/"$photodir"/$(basename "$file") &>> "$log" done if [[ -n "$dev" ]] then echo $(date -u +%Y.%m.%d\ %T)   >> "$log" #    umount "$disk" &>> "$log" fi exit 0
      
      





いく぀かのポむントの説明exiftoolは「Date / Time Original20110730 15:35:52」ずいう圢匏の文字列を返したす。この文字列は「20110730153552」に倉換する必芁がありたす泚むンタヌネットは区切り文字がコロンではなく垂盎の䟋でいっぱいです機胜-あなたが持っおいるものを参照しおください



 curfiletime=$(exiftool -DateTimeOriginal "$file" | cut -d: -f2- | sed 's/[:\ ]//g')
      
      





cut-最初のコロン以降をすべおカットしたす。sedは、結果の文字列からすべおのスペヌスずコロンを削陀したす。sedしか実行できないず確信しおいたすが、RegExpはあたりフレンドリヌではありたせん。



 curfiletime=$(exiftool -DateTimeOriginal "$file" | sed -r 's/^.+: ([0-9]+):([0-9]+):([0-9]+) ([0-9]+):([0-9]+):([0-9]+)/\1-\2-\3 \4:\5:\6/g')
      
      





同じ行を「2011-07-30 15:35:52」に倉換したす。繰り返したすが、おそらくより゚レガントな゜リュヌションが存圚したす。これは、日付を日付ずしお凊理できるようにするためです任意の圢匏では、文字列を挿入するこずはできたせん。



䜿甚する
スクリプトは、指定されたディレクトリずその䞭に含たれるすべおメモリカヌドの堎合はそのルヌトであり、すべおがより深いを1぀ずしお凊理したす。



 ./PhotoSort.sh sdh1
      
      



したがっお、sdh1ドラむブを゜ヌトするために、スクリプトがudevから呌び出されたす。この堎合、ルヌトに蚭定があるファむルがチェックされたす。ディスクは私たちに䞎えられた、たたはディレクトリは最初の文字によっお決定されたす〜/ orの堎合。 -ディレクトリを意味し、そうでない堎合はディスクを意味したす。



 ./PhotoSort.sh ~/AllFromParty
      
      



そしお、〜/ AllFromParty自分を含むで囲たれたすべおのディレクトリからすべおの写真ずビデオファむルを゜ヌトできたす。すべおは、スクリプトで指定されたデフォルトディレクトリに保存されたすphoto = "/ mnt / temp / Photo"。゜ヌスディレクトリに耇数のカメラからのファむルが含たれおいる堎合、カメラ間の時間が同期されおいないか、蚭定されおいないために、ファむル名に矛盟がある可胜性がありたす。これは、異なるカメラから異なるディレクトリぞのファむルの配垃を匕き起こす可胜性がありたす。次に、䞊べ替える前に、EXIFタグで時間を調敎する必芁がありたす。exiftool "-DateTimeOriginal + = 00.00.0000 02:37:30" * .JPG-珟圚のディレクトリのすべおのJPGファむルに぀いお、DateTimeoriginalタグの時間を将来2:37:30にシフトしたす。



 ./PhotoSort.sh ~/AllFromParty /media/backup/Photoes
      
      



䞊蚘ず同じですが、すべおが/ media / backup / Photoesディレクトリに保存されたす





  1. : , KDE , , . , , ( ).
  2. , . ini-.
  3. . . RUN+= , - . udev' , KDE , — . , .
  4. .PhotoSort udev' . , root - . - . (, ) .
  5. , dosfslabel . udev - . - .
  6. : . Caanoo — .PhotoSort .
  7. - , RO .
  8. . , - , ?


参照リスト
Bash-

HOWTO: udev

udev. ( )



All Articles