多数のファイルを日付構造のディレクトリ順に移動する

多数のファイルを日付構造のディレクトリ順に移動する

このディレクトリには約100万のファイルがあります。/home/username/images/

各ファイルの名前は次のとおりです。012345678910(Place)_0_20120414185957_28841.jpgファイル名のタイムスタンプ部分は各画像で変更されます。

以下のコードには、ファイルをこの日付構造にソート/移動するコードが含まれています。/home/username/sorted/2012/04/14/18/name_of_file.jpg

小さなファイルサンプルの場合はうまく機能しますが、大きなディレクトリの場合は、出力後にパテ端末の接続が切断されます。

Directory $newdir does not exist.  Creating same.

常に間違ったコードが原因で終了する他のコードがありますargument list too long

コードは次のとおりです。

#!/bin/bash
ALLFILES=(images/*)
for ((i=0; i<${#ALLFILES[*]}; i+=30000));
do
    set $(echo "${ALLFILES[@]:i:30000}" | awk -F_ '{print $1, $2, $3, $4, $5}')
    fullyear=$3
    year=$(echo $fullyear |cut -c1-4)
    month=$(echo $fullyear |cut -c5-6)
    day=$(echo $fullyear |cut -c7-8)
    hour=$(echo $fullyear |cut -c9-10)
    newdir=$(echo /home/username/sorted/$year/$month/$day/$hour/)
    if ! [ -d $newdir ]; then
        echo Directory $newdir does not exist.  Creating same.
        mkdir -p $newdir;
    fi
    mv "${ALLFILES[@]:i:30000}" $newdir;
done

大規模なループを実行しても接続が維持されない理由についてのアイデアはありますか?

ベストアンサー1

スクリーンセッションで実行してみてください。または別の構造を試してみてください。私はfind + sedが純粋なbashよりもうまくいくと信じています。

find images/ -name "*.jpg" | sed 's%^[^_]*_[^_]*_\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\).*%mkdir -p "/home/username/sorted/\1/\2/\3/\4" \&\& mv "&" "/home/username/sorted/\1/\2/\3/\4/"%'

これは、sed makeコマンドがどのように機能するかを示すためのものです。コマンドはe最後に以下を追加した後に%実行されます。

find images/ -name "*.jpg" | sed 's%^[^_]*_[^_]*_\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\).*%mkdir -p "/home/username/sorted/\1/\2/\3/\4" \&\& mv "&" "/home/username/sorted/\1/\2/\3/\4/"%e'

PS:bashでは使用する必要はありません

day=$(echo $fullyear |cut -c7-8)

Bashは次のことなく自分で行うことができますecho | cut

day=${fullyear:6:2}

おすすめ記事