GNU/Linux >> Linux の 問題 >  >> Linux

ファイル名を別のディレクトリに読み取ってファイルを移動しますか?

名前を読み取ってファイルを移動する必要があります。
システムで生成されたファイルを移動する必要があり、名前にはタイムスタンプが含まれています。月ごとにファイル名を読み取ってファイルを移動する必要があります。

ファイル名に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 これは、「これより前のすべてを無視する」ことを意味します。これにより、コマンドは、一致する文字列のの部分のみを出力します。 空白。全体が月のリストを印刷するだけです。


Linux
  1. 数千を含むフォルダから100ファイルを移動する方法は?

  2. 名前でファイルとディレクトリを削除します。そのようなファイル、又はディレクトリはありません?

  3. ソース ファイルが異なるディレクトリにある Makefile

  1. Linuxターミナルでファイルを移動する

  2. inode でファイルを操作できないのはなぜですか?

  3. エンコーディングが異なる Rdata ファイルの読み取り

  1. findコマンドを使用してLinux上のファイルとディレクトリを検索します

  2. Linuxですべてのディレクトリのファイルを再帰的に検索する方法

  3. 特定のファイルまたはディレクトリを除いて、ファイルをtar(圧縮)する方法