私は撮影したすべての写真をNAS(Qnap TS-231P)に自動的にバックアップするように家族の携帯電話を設定しました。携帯電話ごとのフォルダーです。何らかの理由で多くの写真が警告なしに複数回コピーされた携帯電話。また、一部の写真は大容量ファイルと同様に48MPモードで撮影されたように見える。持つ314281ファイル、合計2.19 TB。
これでフォルダが大きすぎて読み込めず、実際にナビゲーション/使用できなくなります(Windows、Qnapソフトウェア、携帯電話のアプリなど)。 SSHを使用してNASのLinux OSにアクセスし、適切なディレクトリに移動できます。ディレクトリを試してみましたが、du -h
40分後もまだ考えていました(上記のサイズは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