ディレクトリとサブディレクトリ内のすべてのファイルをサイズで並べ替えて一覧表示し、フルパスを表示せずにファイル名のみを一覧表示するスクリプト

ディレクトリとサブディレクトリ内のすべてのファイルをサイズで並べ替えて一覧表示し、フルパスを表示せずにファイル名のみを一覧表示するスクリプト

ディレクトリとサブディレクトリ内のすべてのファイルをサイズで並べ替えて一覧表示し、フルパスは一覧表示せずにファイル名のみを一覧表示するスクリプトを探しています。

find . -type f -exec ls -lhS {} \+動作しますが、パスを提供します。

find . -type f -printf '%f\n'うまくいきますが、ソート方法がわからないか、ここにファイルサイズも含めることができるかどうかはわかりません。

答え1

サポートしている場合(「ファイルサイズ(バイト)」)を使用findできます。%s-printf

sortNULLで区切られた入力()をサポートしている場合は、-z次のことができます。

find . -type f -printf "%s %f\0" | sort -nz | tr '\0' '\n'

答え2

システムがzshコマンドをサポートしている場合は、bashスクリプトで実行できます

zsh -c 'ls -lhS -- **/*(.D)'

これには説明が必要な場合があります。

  • zsh:何よりもbash多くの機能を備えたより強力なシェルです。
  • -c:実行するコマンドとして次のパラメータを使用します。zsh
  • ls -lhS:あなたの質問によると、これは実行したいコマンドです
  • ---文字で始まる可能性がある奇妙なファイル名を処理します。
  • **:全体的な状況複数のディレクトリの一致
  • *:基準全体的な状況- このディレクトリ内のすべてのファイルと一致
  • ():グローバル予選どのファイルを選択するか、どの順序で選択するかを指定します。
  • .:プレーンテキストファイルのみを選択します(type fと同じfind)。
  • D:結果にドットファイル(隠しファイル)を含めます。

質問をもう一度読んだ後は、前の部分だけでなく結果から完全なパスを削除することをお勧めします。これは次の方法で続けることができますzsh

print -l **/*(.OLDe:'reply=${REPLY##*/}':)

しかし、これは結局トリックに関するものではないので少し多いかもしれませんので、+を使って「標準」ソリューションをzsh提案します。findsed

find . -type f -exec sh -c 'ls -lhS "$@" | sed "s| \..*/| |"' {} \+

関連情報