名前を読み取ってファイルを移動する必要があります。
システムで生成されたファイルを移動する必要があり、名前にはタイムスタンプが含まれています。月ごとにファイル名を読み取ってファイルを移動する必要があります。
ファイル名に201601*.txt
が含まれている場合 、次に2016/January
に移動します ディレクトリ。ファイル名に201602*.txt
が含まれている場合 次に、2016/February
に移動します ディレクトリなど
承認された回答:
日付文字列がファイル名にあり、すべてのファイルが同じディレクトリにある場合は、次のように実行できます。
mv 201601*.txt 2016/January
これを手動で12回行うのは面倒なので、番号と対応する月の名前を含むリストを作成します。
$ paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}')
01 January
02 February
03 March
04 April
05 May
06 June
07 July
08 August
09 September
10 October
11 November
12 December
次に、それを解析してmv
を構築します コマンド:
$ paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}') |
while read num month; do echo mv "*2016$num*" 2016/"$month"; done
mv *201601* 2016/January
mv *201602* 2016/February
mv *201603* 2016/March
mv *201604* 2016/April
mv *201605* 2016/May
mv *201606* 2016/June
mv *201607* 2016/July
mv *201608* 2016/August
mv *201609* 2016/September
mv *201610* 2016/October
mv *201611* 2016/November
mv *201612* 2016/December
必要な処理が確実に行われたら、echo
を削除します 実際にファイルを移動するには:
paste <(printf '%sn' {01..12}) <(cal 2016 | grep -Po 's+K[A-Z]w{2,}') |
while read num month; do echo mv "*2016$num*" 2016/"$month"; done
説明
grep -Po 's+K[A-Z]w{2,}')
grep
を実行します Perl互換の正規表現を使用(-P
)、各行の一致する部分のみを出力します(-o
)。使用される正規表現は、1つ以上の空白文字(s+
)を検索します )の後に大文字([A-Z]
)および2つ以上の単語文字(w{2,}
)。 K
これは、「これより前のすべてを無視する」ことを意味します。これにより、コマンドは、一致する文字列の後の部分のみを出力します。 空白。全体が月のリストを印刷するだけです。