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