セキュリティカメラの多くのファイルを含む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
_
-
20240301
date
20240301
その後、Perl 置換で最初の 4 文字の後にスペースを挿入し、次の 2 文字の後にスペースを挿入し、次の 2 文字の後に別のスペースを挿入して渡します。したがって、これは、asとasで保存されます20240301
(ここでは標準日付を仮定し、アメリカスタイルを使用する場合は変数名の順序を変更してください)。2024 03 01
read
2024
$year
03
$month
01
$day
次に、最初に定義した親ディレクトリ udner を$target
使用して、作成するディレクトリの名前を含む変数を作成します。最後の手順では、成功を想定して別のディレクトリが作成されます(ディレクトリがすでに存在しているがターゲットにアクセスできない場合は、そのファイルをコピーします)。outDir
mkdir -p