日付範囲で写真をカタログに絞り込む

日付範囲で写真をカタログに絞り込む

私は撮影したすべての写真をNAS(Qnap TS-231P)に自動的にバックアップするように家族の携帯電話を設定しました。携帯電話ごとのフォルダーです。何らかの理由で多くの写真が警告なしに複数回コピーされた携帯電話。また、一部の写真は大容量ファイルと同様に48MPモードで撮影されたように見える。持つ314281ファイル、合計2.19 TB

これでフォルダが大きすぎて読み込めず、実際にナビゲーション/使用できなくなります(Windows、Qnapソフトウェア、携帯電話のアプリなど)。 SSHを使用してNASのLinux OSにアクセスし、適切なディレクトリに移動できます。ディレクトリを試してみましたが、du -h40分後もまだ考えていました(上記のサイズはQnapソフトウェアからのものです)。

このファイルには実際の問題はないと思われるので、ファイルを複数のフォルダに配置すると便利です。

毎月のフォルダ、四半期ごとのフォルダなど、変更日ごとにファイルをフィルタリングするコマンドをどのように入力しますか?

ボーナスポイントを取得するには、アクションを実行する前にレポートを314281ファイルにインポートできます(例:.txtまたは.csvにエクスポート)。

私はLinuxを初めて使用しますので、ご了承ください。

答え1

私は次のようなものを持っています

2019年4月から同様の目的でシェルスクリプトを使用しており、テストがうまくいきました。

  • 私のデータパーティションのマウントポイントに対してハードコードされています。修正する必要があります。

  • ファイル名を小文字に移動します。スキップしたいかもしれません。

  • 保持しているファイル数が多すぎて最適化されていません。たぶん遅すぎるので、より速くするために調整する必要があります。たぶん並列処理を使用することもできます。

  • 「main」の find コマンドとその周辺のコマンドは時間の無駄です。少なくとも大規模な初期バッチジョブの場合は、それを削除する必要があると思います。 (リクエストされたレポートかもしれませんが、時間の無駄に過ぎないと思います。)

  • ファイルが移動された場所に同じ名前の別のファイルが見つかった場合は、対話型です。少なくとも大規模な初期バッチジョブの場合は、速度を向上させるためにそれらを削除できます。

  • mvこのコマンドは、同じファイルシステム内を移動するときは高速ですが、ファイルシステム間(パーティション間)を移動(コピーおよび削除)するときは遅くなります。

修正後に大きな作業を始める前に、少数のファイルをテストしてください。

pict2dirtree:

#!/bin/bash


function doit {

 fildir=$(find -name "$1" -printf "%TY/%Tm/%Td")
 lcas=${1##.*}
 lcas=${lcas,,}
 fildir="/media/multimed-2/Photos/$fildir"
 mkdir -p "$fildir"
 filnam="$fildir/${lcas}"
#echo "fildir=$fildir"
#echo "filnam=$filnam"
#echo "$lcas"
#exit
 if test -s "$filnam"
 then
  diff -q "$1" "$filnam"
  if [ $? -eq 0 ]
  then
   rm "$1"
  else
   read -p "move to '_$lcas' (y/N) " ans
   if [ "$ans" == "y" ]
   then
    mv -i "$1" "${fildir}/_$lcas"
   fi
  fi
 else
  mv "$1" "$filnam"
 fi
}

########################################################################

# main

########################################################################

if [ "$(whoami)" == "root" ]
then
 echo "Usage: Do *not* run with sudo"
 exit
fi

find -maxdepth 1 -type f -exec ls -l --time-style=long-iso "{}" \;|tr -s ' ' ' '|cut -f 6,8|sort|more
echo "Move files from the current directory (no subdirectories)"
read -p "Are you ready to move these files (y/N) " ans
if [ "$ans" != "y" ]
then
 exit
fi

for i in *
do
 if test -f "$i"
 then
  doit "$i"
 else
  echo "skipping $i"
 fi
done

関連情報