再帰的にディレクトリで最大のファイルを見つけようとします。ディレクトリ内にサブディレクトリがある場合、関数はディレクトリに移動して最大のファイルが存在することを確認する必要があります。最大ファイルを見つけると、相対パス名と最大ファイルの名前とサイズを含む出力が表示されます。
前任者:
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
ディレクトリツリーを下るときにシンボリックリンクに従いました。