2016-11-14 18 views
4

私はLinuxについてもっと学び、今朝awkコマンドに焦点を当てました。私が働こうとしてきたコマンドは以下の通りです。AWK出力を使用したLinux CP

ls -lRt lpftp.* | awk '{print $7, $9}' | mkdir -p $(awk '{print $1}') | ls -lRt lpftp.* | cp $(awk '{print $9, $7}') 

私は、ディレクトリ内の各ファイルを、最後に変更されたファイルに基づいてサブディレクトリに移動しようとしています。コマンドは最初に必要なファイルだけを出力し、mkdirを使用して、最後に変更された日に基づいてフォルダを作成します。私はそれの後にやりたいことは、コマンドが今、それは01のフォルダにすべてのファイルを移動し、すべてのディレクトリに次のテキストに一度

cp: 0653-436 12 is a directory. 
    Specify -r or -R to copy. 

をプリントアウトしかしとして、それに関連付けられたディレクトリに各ファイルを移動しています。

誰でもこの問題を解決できる方法を知っていますか?もしそれについてもっと良い方法があれば?

+0

なぜ 'mkdir'の出力を' ls'にパイプしていますか? 'mkdir'は(エラーメッセージ以外の)出力を生成せず、' ls'はその入力を使いません。 – Barmar

+0

2番目のLSステートメントの理由は、mkdirの後に元のLSのファイル名にアクセスできなかったためです。そのリストを再作成するためにもう一度実行しました。そこには良い方法がありますか? – Cronisej

+0

@Cronisejはい、私の答えを見てください。 – eddiem

答えて

3

ls -lRt lpftp.* | awk '{print $7, $9}' | while read day file ; do mkdir -p "$day"; cp "$file" "$day"; done

dodone間のコマンドは、(ライン当たり)day変数とfile第二にawkプリント最初で、出力の各ラインに対して実行されます。ここでは引用符を使用していますが、変数が設定されているメソッドに変数が含まれていないため、不必要に引用符を使用しています。

1

このようなやり方で実行するのが最も安全な方法は、データにawkを使用してシェルスクリプトを出力することです。 awkでは、実行すると予想されるコマンドmkdircpを出力します。あなたが満足するまでのヘッド(1)に結果をパイプします。たぶん、全体を(1)で見てください。次に、次のように実行します。

ls -lRg lpfpt.* | awk script.awk | sh -ex 

これは、コマンドを標準エラーにエコーし、最初のエラーで停止します。それが正しいと非常に確信しているならば、xオプションを落としてください。

ループまたは(system機能付)awkでのサブプロセスの束を超えるこのアプローチの利点は次のとおりです。

  • あなたが起こるために何が起こっているのか見ることができ、および実行の
  • 速度を何が起こっています
関連する問題