ディレクトリ内の最大のファイルを再帰的に検索しようとしています。そのディレクトリ内にサブディレクトリがある場合、関数はそのディレクトリ内に移動し、最大のファイルが存在するかどうかを確認する必要があります。最大のファイルが見つかると、相対パス名と最大のファイルの名前とサイズが出力に表示されます。
例:
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ツールをパイプライン化してこれを実装することはできません。どんなアイデアでもいいです!
find
(ここではGNU find
と仮定)を使用して、ファイルサイズのファイル名を出力します。並べ替えて、最大のものを印刷します。
find . -type f -printf "%s\t%p\n" | sort -n | tail -1
これは、ファイルパスに改行文字が含まれていないことを前提としています。
GNU bash
の実装)で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"
これは、検索ソリューションよりも大幅に遅くなります。これは、ファイル名が改行文字で終わっておらず、隠しファイルをスキップし、隠しディレクトリに移動しないことも想定しています。
現在のディレクトリに-
というファイルがある場合、stdinで開いているファイルのサイズが考慮されます。
4.3より前のバージョンのbash
は、ディレクトリツリーを降りるときにシンボリックリンクをたどったことに注意してください。
このコマンドは、定義されたサイズもリストするのに役立ちます。
find . -type f -size +100M -exec ls -lh {} \;
これはBSD/macOSで動作します:
find . -type f -ls | sort -k7 -r
| head -n 3
を追加して、興味深いエントリの数を表示することもできます(この場合は3)。
zsh
を使用して、最大の通常ファイルの場合:
ls -ld -- **/*(.DOL[1])
(もちろん、ls -ld --
任意のコマンド。 GNU ls
または互換性のあるものを使用している場合は、-h
オプション人間が読めるサイズ)
.
:regularファイルのみ(ディレクトリ、シンボリックリンク、デバイス、fifos ...ではない)D
:隠されたものを含め、隠されたディレクトリに降りるOL
:サイズで逆順(L
ength)。[1]
:最初の一致のみ。同点の場合、ランダムにそれらのいずれか1つを取得します。最初をアルファベット順にしたい場合は、on
(o
rder by n
ame)を追加して、タイをアルファベット順に並べ替えます。
ディスクの使用量ではなく、ファイルサイズが考慮されることに注意してください。