2017-03-22 9 views
-1

AWKが指定されたツールの作業を進めています。AWKを使用して変更されたファイルを選択

タスクがあるファイルを一覧表示することです:サイズ1MB以下(サイズ< = 1048576バイト)

  • ユーザ入力の今日(スクリプトが実行されているのと同じ日)
  • 修正

    • 検索を開始する場所を指示することです。
    • ファイルを再帰的に検索します。

    スクリプト:

    #!/bin/bash

    #User's input target for search of files. 
    target="$1" 
    
    #Absolute path of target. 
    ap="$(realpath $target)" 
    echo "Start search in: $ap/*" 
    
    #Today's date (yyyy-mm-dd). 
    today="$(date '+%x')" 
    
    #File(s) modified today. 
    filemod="$(find $target -newermt $today)" 
    
    #Loop through files modified today. 
    for fm in $filemod 
    do 
        #Print name and size of file if no larger than 1 MiB. 
        ls -l $fm | awk '{if($5<=1048576) print $5"\t"$9}' 
    done 
    

    私の問題は、forループファイルのサイズを気にしないということです!

    すべての変数は、意図した値になります。 AWKはfor-loopの外で行うべきことをします。私は無駄な引用符を試しました。

    誰かが間違っていると言うことができますか?

    フィードバックに感謝します。ありがとうございます。

    アップデート:私は、ファイルに対して明示的に検索して、それを解決してきました :

    filemod="$(find $target -type f -newermt $today)" 
    

    事項ことを来るどのように?

  • +0

    こんにちは、私は明示的にファイルを検索した後、望ましい結果を持っている:filemodを= "$(今日は$ target-type f -newermt $を見つけてください)" どのように重要ですか? – henrix

    答えて

    2

    Don't parse 'ls' output.使用statではなく、次のように:

    for fm in $filemod; do 
        size=$(stat --printf='%s\n' "$fm") 
        if ((size <= 1048576)); then 
        printf "%s\t%s\n" "$size" "$fm" 
        fi 
    done 
    

    上記の方法は、自分の名前に空白またはワイルドカードを持つファイルへの免疫ではありません。優雅にこのようなファイルを処理するには、次の操作を行います。

    while IFS= read -r -d '' file; do 
        size=$(stat --printf='%s\n' "$file") 
        if ((size <= 1048576)); then 
        printf "%s\t%s\n" "$size" "$file" 
        fi 
    done < <(find $target -newermt $today -print0) 
    

    も参照してください:

    +2

    あなたは '-size':' IFS = read -r -d '' nの間にも使うことができます。 printf '%q \ n' "$ n"を実行してください。 done <<(find。-type f -mtime -1 -size -1048576c -print0) ' –

    +0

    あなたの努力に感謝します。 私はあなたのソリューションがよりうまくいくと考えていますが、AWKはこのタスクの前提条件です。 – henrix

    関連する問題