ファイルを日付別に整理する

ファイルを日付別に整理する

現在、ファイルのリストを日付別にサブディレクトリに整理するスクリプトを作成しようとしています。日付は、 の形式で各ファイルの最初の行に含まれていますYYYY-MM-DD。 head コマンドを使用して各ファイルの最初の行を抽出し、-/に置き換えて にしましたYYYY/MM/DD。これにより、ファイル パスとして使用できます。

YYYY>MM>DD次に、たとえば日付を含むファイルが2015/10/19ファイル パス./2015-> ./2015/10->に保存されるサブディレクトリを作成します./2015/10/19。これらのサブディレクトリは に作成する必要があります~/fileList/

これが私がこれまでに作成したコードです。

for file in ~/fileList/*
do
   head -1 $file | tr "-" "/")
done

これはサンプルファイルです

2001-02-03
Thursday
Paris
44952

サブディレクトリを作成し、各ファイルを正しいディレクトリに保存する方法を見つけるのに苦労しています。コードの提案があれば、ぜひお願いします。

私はbashシェルを使用しています。

答え1

次のようにします。

for file in ~/fileList/*
do
    newpath=$(head -1 "$file" | tr '-' '/')
    mkdir -p "$newpath"
    echo "would now execute 'mv $file $newpath'"
done

これにより、変換された日付が変数に保存され$newpath、そのディレクトリと、まだ存在しない場合は不足している親が作成されます。サブディレクトリは、スクリプトを実行するディレクトリに作成されます。

現在の形式では、実行されるコマンドが出力されます。満足したら、次のように変更します。

mv "$file" "$newpath"

アップデート:ターゲット ディレクトリは、ファイルが元々存在するソース ディレクトリの下に配置されると述べているため、スクリプトを複数回実行した場合に、新しく生成されたエントリに遭遇しないようにするためのチェックが必要です。

  • ファイルを拡張子 (例.txt) で識別できる場合は、ループをより具体的にすることができます。
    for file in ~/fileList/*.txt
    do
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        ...
    done
    
  • それ以外の場合、通常のファイルのみをオペランドとして受け入れる方法もあります。
    for file in ~/fileList/*
    do
        if [[ ! -f $file ]]; then continue; fi
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        mkdir -p "$newpath"
        mv "$file" "$newpath"
    done
    

関連情報