現在のファイルのリストを日付別にサブディレクトリとして構成できるスクリプトを作成しようとしています。日付は 。形式で各ファイルの最初の行に含まれています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