再帰的にディレクトリで最大のファイルを見つけようとします。ディレクトリ内にサブディレクトリがある場合、関数はディレクトリに移動して最大のファイルが存在することを確認する必要があります。最大ファイルを見つけると、相対パス名と最大ファイルの名前とサイズを含む出力が表示されます。
前任者:
dude@shell2 (~...assignment/solutions) % bash maxfile.sh ~/test
class/asn
dude.h.gch: 9481628
これが私が持っているものです:
#!/bin/sh
clear
recursiveS() {
for d in *; do
if [ -d $d ]; then
(cd $d; echo $(pwd)/$line; du -a; recursiveS;)
fi
done
}
recursiveS
しばらく目詰まりしました。既存の多くのUnixツールをパイピングしてこれを達成することはできません。どんなアイデアでもいいでしょう!
答え1
ファイル名とファイルサイズを出力するにはfind
(ここではGNUと仮定)を使用してください。find
タイプ。最大のものを印刷してください。
find . -type f -printf "%s\t%p\n" | sort -n | tail -1
ファイルパスに改行文字が含まれていないとします。
bash
GNU実装でループを使用するstat
:
shopt -s globstar
max_s=0
for f in **; do
if [[ -f "$f" && ! -L "$f" ]]; then
size=$( stat -c %s -- "$f" )
if (( size > max_s )); then
max_s=$size
max_f=$f
fi
fi
done
echo "$max_s $max_f"
これは解決策を見つけるよりはるかに遅いです。これはまた、ファイル名が改行文字で終わらず、隠されたファイルをスキップし、隠されたディレクトリが入力されないことを前提としています。
呼び出される現在のディレクトリにファイルがある場合は、-
標準入力で開いているファイルのサイズが考慮されます。
4.3より前のバージョンでは、bash
ディレクトリツリーを下るときにシンボリックリンクに従いました。
答え2
このコマンドは、定義されたサイズを一覧表示するのにも役立ちます。
find . -type f -size +100M -exec ls -lh {} \;
答え3
これはBSD / macOSで動作し、高速ですがPOSIXではなくユーティリティ-ls
拡張を使用しますfind
。
find . -type f -ls | sort -k7 -r | head -n 3
速度は遅いが-ls
拡張機能は利用できないPOSIXシステムで動作しますfind
。
find . -type f -exec ls -al {} \; | sort -k5 -r | head -n3
仕組み:
find
以下に説明する特定のクエリに基づいて結果を表示する強力なファイル検索ユーティリティ。find .
現在の作業ディレクトリから検索します。find . -type f
指定されたファイル形式「f」のみが検索されます。つまり、通常のファイルです(ディレクトリ、特殊ファイル、リンク、ソケットなどをスキップします)。-ls
スイッチは、find
見つかったファイルに関する完全な情報を表示するように表示されます。ただし、BSDシステムの担当者によると、これはIEEE Std 1003.1-2001(「POSIX.1」)規格の拡張であり、すべてのプラットフォームで機能しない可能性があります。- または、
-ls
システムで拡張機能が利用できない場合は、コマンドを-exec .. {} \;
使用して5番目のフィールドを使用して結果を並べ替えることができます。見つかったファイル名を示します。コマンドが含まれています。ls -al
{}
\;
-exec
|
Unix 記号は、あるプログラムの出力を別のプログラムの入力にリダイレクトする「パイプ」を意味します。find
プログラム出力テキストをsort
プログラムへの入力として送信します。sort
ソートユーティリティです。データ行を取得し、結果に従って行を昇順に並べ替えます。sort -k7
7番目のフィールドがソートパラメータ値として使用されることを示します。パラメータはスペースで区切ります。 7番目のパラメーターは、ユーティリティーによって生成されたファイルのサイズですfind
。-exec ls -al {} \;
代わりに使用する場合は、-ls
5番目のフィールドを使用して-k5
ソートされます。-r
sort
最大のものを最初に配置し、逆アライメントを使用するように指示します。なぜなら、私たちは最初に最大のファイルを見たいからです。- また、何百行も実際に表示したくない場合は、ソートされた
|
出力をhead
指示に従って結果出力の最初の3行だけを表示するユーティリティにパイプすることもできます。-n 3
簡単に言うと、通常のファイルを再帰的に見つけるために使用されます。現在の作業ディレクトリでのみ検索を開始し、拡張子(または実行)を使用してfind
ファイルに関する完全な情報を表示します。後でUnixパイプを使用して結果をに渡し、最初に7番目(または5番目)のフィールドに基づいて最大値にソートします。ユーティリティを使用して結果を行に制限することもできます。-ls
ls -al
find
sort
|
n
head
「Brainzを使う」とは、「人」を読み、オフラインで直接ソリューションを検索できるようにして、最初から問題を解決するように訓練することです。 :-)
答え4
またスティーブン・チャジェラス'返信、次のメモを追加したい(コメントできません):
- 最小の一般ファイルを取得するには、
o
代わりに次のように使用しますO
。
ls -ld -- **/*(.DoL[1])
- ワイルドカードに特定の拡張子を追加してフィルタリングできます
**/*
。
ls -ld -- **/*.png(.DoL[1])
ls -ld -- **/*.{png, jpg}(.DoL[1]) # this will give two results, one per extension