ファイル名変数のリストをサイズでソート

ファイル名変数のリストをサイズでソート

ファイル名を取得し、サイズでリストを並べ替え、リストからコマンドを実行する小さなスクリプトを作成しようとしています。これまで私は以下を持っています:

#!/bin/bash
filenames="one \
           two \
           three"
for i in $filenames; do
...
done

うまくいきますが、forコマンドを押す前にファイルサイズでリストをソートしたいと思います。

ベストアンサー1

ファイル名に改行文字が含まれておらず、システムにGNUがある場合は、次のことがstatできます。

  • 配列変数の使用filenames
  • stat各ファイルのサイズとファイル名を印刷し、結果sort(逆数)を使用してから最初のフィールド(サイズ)を削除して、cutファイル名をサイズでソートする(最も大きいものから)。
  • さらなる処理のために、結果をwhileループに供給します。

filenames=( one two three )
while IFS= read -r file; do
  echo "do something with $file"
done < <(stat --printf '%s\t%n\n' -- "${filenames[@]}" | sort -nr | cut -f2-)

上記と同じですが、ヌル文字を区切り文字として使用します(ファイル名に改行文字が含まれていないことを保証できない場合は、GNUsortとGNUも必要ですcut)。

filenames=( one two three )
while IFS= read -r -d $'\0' file; do
  printf 'do something with %s\n' "$file"
done < <(stat --printf '%s\t%n\0' -- "${filenames[@]}" | sort -znr | cut -zf2-)

タイプのファイル名に注意してください。シンボリックリンク、リンク自体のサイズ(リンクが指すファイルのサイズではない)が考慮されます。変更-Lするにはオプションを追加してください。stat

標準入力で開かれたファイルとして解釈されるという名前のファイルでは機能しません-stat使用./-して解決してください。

おすすめ記事