5

ディレクトリ全体を wc -l してから、ファイル名をエコーで行数とともに表示しようとしています。

私の欲求不満に加えて、ディレクトリは渡された引数から取得する必要があります。ばかげているように見えなくても、最初wc -l $1に引数に入力したディレクトリの行数がシンプルに表示されない理由を誰かが教えてくれませんか? 私はそれを完全に理解していないことを知っています。

それに加えて、指定された引数がディレクトリではないか、複数の引数がある場合、検証も必要です。

4

6 に答える 6

6

wcディレクトリではなくファイルで機能するため、ディレクトリ内のすべてのファイルの単語数が必要な場合は、次から始めます。

wc -l $1/*

合計を取り除き、並べ替えて最大のものだけを抽出するためのさまざまな回転を使用すると、次のような結果になる可能性があります (読みやすくするために複数の行に分割されますが、1 行に入力する必要があります)。

pax> wc -l $1/* 2>/dev/null
       | grep -v ' total$'
       | sort -n -k1
       | tail -1l

2892 target_dir/big_honkin_file.txt

検証に関しては、次のような方法でスクリプトに渡されたパラメーターの数を確認できます。

if [[ $# -ne 1 ]] ; then
    echo 'Whoa! Wrong parameteer count'
    exit 1
fi

そして、それがディレクトリであるかどうかを確認できます:

if [[ ! -d $1 ]] ; then
    echo 'Whoa!' "[$1]" 'is not a directory'
    exit 1
fi
于 2013-06-12T05:31:24.680 に答える
2

これは、あなたの望むことですか?

> find ./test1/ -type f|xargs wc -l
       1 ./test1/firstSession_cnaiErrorFile.txt
      77 ./test1/firstSession_cnaiReportFile.txt
   14950 ./test1/exp.txt
       1 ./test1/test1_cnaExitValue.txt
   15029 total

したがって、引数であるディレクトリは次の場所に移動する必要があります。

find $your_complete_directory_path/ -type f|xargs wc -l
于 2013-06-12T06:04:20.590 に答える
1

ディレクトリ全体を wc -l してから、ファイル名をエコーで行数とともに表示しようとしています。

findディレクトリで実行し、-execオプションを使用してトリガーすることができますwc -l。このようなもの:

$ find ~/Temp/perl/temp/ -exec wc -l '{}' \;
wc: /Volumes/Data/jaypalsingh/Temp/perl/temp/: read: Is a directory
      11 /Volumes/Data/jaypalsingh/Temp/perl/temp//accessor1.plx
      25 /Volumes/Data/jaypalsingh/Temp/perl/temp//autoincrement.pm
      12 /Volumes/Data/jaypalsingh/Temp/perl/temp//bless1.plx
      14 /Volumes/Data/jaypalsingh/Temp/perl/temp//bless2.plx
      22 /Volumes/Data/jaypalsingh/Temp/perl/temp//classatr1.plx
      27 /Volumes/Data/jaypalsingh/Temp/perl/temp//classatr2.plx
       7 /Volumes/Data/jaypalsingh/Temp/perl/temp//employee1.pm
      18 /Volumes/Data/jaypalsingh/Temp/perl/temp//employee2.pm
      26 /Volumes/Data/jaypalsingh/Temp/perl/temp//employee3.pm
      12 /Volumes/Data/jaypalsingh/Temp/perl/temp//ftp.plx
      14 /Volumes/Data/jaypalsingh/Temp/perl/temp//inherit1.plx
      16 /Volumes/Data/jaypalsingh/Temp/perl/temp//inherit2.plx
      24 /Volumes/Data/jaypalsingh/Temp/perl/temp//inherit3.plx
      33 /Volumes/Data/jaypalsingh/Temp/perl/temp//persisthash.pm
于 2013-06-12T06:00:52.110 に答える
0

現在のディレクトリとそのサブディレクトリでほとんどの行を含むファイルを見つけるには、次のようにしますzsh

lines() REPLY=$(wc -l < "$REPLY")
wc -l -- **/*(D.nO+lined[1])

これは、パスが で指定されたファイルの行数linesを返す glob ソート関数として使用される関数を定義します。$REPLY$REPLY

次に、zshの再帰的グロビングを使用**/*して通常のファイル ( ) を検索し、関数 ( ) を使用して.数値的に ( n) 逆ソート ( O) し、最初のファイルを選択します。(ドットファイルを含め、ドットディレクトリをトラバースします)。lines+lines[1]D

ファイル名に含まれる可能性のある文字 (改行、スペースなど) を想定したくない場合、標準のユーティリティでそれを行うのは少し注意が必要です。ほとんどの Linux ディストリビューションにある GNU ツールを使用すると、NUL で終了する行を処理できるため、少し簡単になります。

find . -type f -exec sh -c '
  for file do
    size=$(wc -c < "$file") &&
      printf "%s\0" "$size:$file"
  done' sh {} + |
  tr '\n\0' '\0\n' |
  sort -rn |
  head -n1 |
  tr '\0' '\n'

または、zsh または GNU bash 構文を使用します。

biggest= max=-1
find . -type f -print0 |
  {
    while IFS= read -rd '' file; do
      size=$(wc -l < "$file") &&
        ((size > max)) &&
        max=$size biggest=$file
    done
    [[ -n $biggest ]] && printf '%s\n' "$max: $biggest"
  }
于 2013-06-12T07:13:10.433 に答える