ディレクトリとサブディレクトリ内のすべてのファイルをサイズで並べ替えて一覧表示し、フルパスは一覧表示せずにファイル名のみを一覧表示するスクリプトを探しています。
find . -type f -exec ls -lhS {} \+
動作しますが、パスを提供します。
find . -type f -printf '%f\n'
うまくいきますが、ソート方法がわからないか、ここにファイルサイズも含めることができるかどうかはわかりません。
答え1
サポートしている場合(「ファイルサイズ(バイト)」)を使用find
できます。%s
-printf
sort
NULLで区切られた入力()をサポートしている場合は、-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
提案します。find
sed
find . -type f -exec sh -c 'ls -lhS "$@" | sed "s| \..*/| |"' {} \+