ファイルに含まれる日付でファイルを整理します。

ファイルに含まれる日付でファイルを整理します。

現在のファイルのリストを日付別にサブディレクトリとして構成できるスクリプトを作成しようとしています。日付は 。形式で各ファイルの最初の行に含まれています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
    
  • そうでない場合、1つのアプローチは、通常のファイルをオペランドとして許可することです。
    for file in ~/fileList/*
    do
        if [[ ! -f $file ]]; then continue; fi
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        mkdir -p "$newpath"
        mv "$file" "$newpath"
    done
    

関連情報