検索を使用したファイルの移動とクリーンアップ

検索を使用したファイルの移動とクリーンアップ

セキュリティカメラの多くのファイルを含むNAS / Homelabサーバーとして使用されるDebian GNU / Linux 12(bookworm)x86_64サーバーにフォルダがあります。

MDAlarm_20240301-091804.jpg
...
MDAlarm_20240316-153813.jpg
MDAlarm_20240327-183713.jpg

(たとえば)を使用してファイルを移動しようとすると、mv snap/*.jpg /path/to/dest/2024/03次の結果が表示されます。

-bash: /usr/bin/mv: Argument list too long

私は次のことを考えていました。この回答 find snap -name '*202403??-??????.jpg' -exec mv -t /path/to/dest/2024/03 {} +はい、しかし年と月に適したフォルダを作成するために「1行」はありますか?

写真を見て並べ替えるためにSamba共有に移動しています。

答え1

まず、必ずしも年と月のフォルダがある必要はありません。以下を使用して移動できますfind

find snap -name '*202403??-??????.jpg' -exec mv -t /path/to/dest {} +

今、日付で並べ替える必要があり、すべてのファイルがあるように見える場合は、MDAlarm_日付、a、-時間順に.jpgスペースやその他の奇妙な文字なしで並べ替える必要があります。次のようにできます。

outDir=/some/existing/directory
find snap -type f -name '*202403??-??????.jpg' | 
while read filename; do
  date=$(awk -F'[-_]' '{print $2}' <<<"$filename")
  read year month day < <(perl -pe 's/(....)(..)(..)/$1 $2 $3/' <<<"$date") 
  target="$outDir/$year/$month/$day"
  mkdir -p -- "$target" &&
     mv -- "$filename" "$target"
done

これはまた、ファイル名の前のパスに-または_文字がないと仮定します。それで、そうしようとしましたが、そのようなことが起こればsnap/some-dir/MDAlarm_20240301-091804.jpg失敗します。

方法は比較的簡単です。findコマンドを実行し、出力を解析します。まず、ファイル名awkまたはフィールド区切り文字を使用して日付を取得します。ファイルが常に次のような場合、2番目のフィールドは日付を定義します。だから得られた値。-_MDAlarm_20240301-whatever_-20240301date20240301

その後、Perl 置換で最初の 4 文字の後にスペースを挿入し、次の 2 文字の後にスペースを挿入し、次の 2 文字の後に別のスペースを挿入して渡します。したがって、これは、asとasで保存されます20240301(ここでは標準日付を仮定し、アメリカスタイルを使用する場合は変数名の順序を変更してください)。2024 03 01read2024$year03$month01$day

次に、最初に定義した親ディレクトリ udner を$target使用して、作成するディレクトリの名前を含む変数を作成します。最後の手順では、成功を想定して別のディレクトリが作成されます(ディレクトリがすでに存在しているがターゲットにアクセスできない場合は、そのファイルをコピーします)。outDirmkdir -p

関連情報