ディレクトリ全体を wc -l してから、ファイル名をエコーで行数とともに表示しようとしています。
私の欲求不満に加えて、ディレクトリは渡された引数から取得する必要があります。ばかげているように見えなくても、最初wc -l $1
に引数に入力したディレクトリの行数がシンプルに表示されない理由を誰かが教えてくれませんか? 私はそれを完全に理解していないことを知っています。
それに加えて、指定された引数がディレクトリではないか、複数の引数がある場合、検証も必要です。
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
これは、あなたの望むことですか?
> 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
ディレクトリ全体を 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
現在のディレクトリとそのサブディレクトリでほとんどの行を含むファイルを見つけるには、次のようにします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"
}