さまざまなフォルダから検索されたファイルをサイズで並べ替える

さまざまなフォルダから検索されたファイルをサイズで並べ替える

$ HOMEディレクトリ内のすべてのPDFを検索しました。

$ find -E ~ -regex ".*/[^/].*.pdf"

1000個以上のファイルを印刷し、
サイズ別にソートして検索する予定です。

$ stat -f '%z' draft.sh
184

私はスクリプトドラフトを書きました。

#! /usr/local/bin/bash

OLD_IFS=IFS 
IFS=$'\n'

touch sorted_pdf.md

for file in $(find -E ~ -regex ".*/[^/].*.pdf")
do
    file_size=$(stat -c "%s" $file)
    ....

done > sorted_pdf.md

IFS=OLD_IFS

彼らが一緒に働いて結果を得るのは難しかった。どのようなヒントを提供できますか?

コードをリファクタリングしました。

#! /bin/zsh
OLD_IFS=IFS 
IFS=$'\n'

touch sorted_pdf.md

for file in $(find -E ~ -regex ".*/[^/].*.pdf")
do
    # file_size=$(stat -c "%s" $file)
    printf '%s\n' $file(DoL)

done > sorted_pdf.md

IFS=OLD_IFS

しかし、エラーレポートを受け取りました

$./sort_files.sh

./sort_files.sh: line 12: syntax error near unexpected token `('
./sort_files.sh: line 12: `    printf '%s\n' $file(DoL)'

ベストアンサー1

zshサイズでソートするには、glob修飾子を使用できます(zshmacOSにデフォルトでインストールされており、既存でも使用されますsh)。

#! /bin/zsh -
printf '%s\n' **/*.pdf(DoL)
  • **/再帰的なワイルドカードです。
  • (DoL)Dドットファイル(隠しファイル)を含み、結果のリストをファイルの長さでソートするために使用されるfindgloboL修飾子L

これは-regex ".*/[^/].*.pdfあまり意味がありません。

たとえば、on /home/foo/pdf.*on /home、then /[^/]onf次に.*on oo.on、/次に一致しますpdf

を使用または-regex使用せずにファイルを一致させる-Eことができますが、標準 。-regex '.*\.pdf'*.pdf-name '*.pdf'

あなたが使用できる:

find . -name '*.pdf' -exec stat -f '%z %N' {} + |
  sort -n |
  cut -d ' ' -f 2-

ただし、改行文字を含むファイルパスがある場合は機能しません。

GNUユーティリティを使用すると、次のことができます。

find . -name '*.pdf' -printf '%s %p\0' |
  sort -nz |
  cut -zd ' ' -f 2- |
  tr '\0' '\n'

これらのファイルのいずれかがシンボリックリンクである場合、pdfシンボリックリンクターゲットのサイズではなく、シンボリックリンクのサイズが考慮される。このターゲットのサイズに基づいて並べ替えるには、オプションをDoLに変更またはD-oL追加-Lしますstat。 GNUの場合find

find -L . \( ! -xtype l -o -prune \) -name '*.pdf' -printf '%s %p\0' |
  sort -nz |
  cut -zd ' ' -f 2- |
  tr '\0' '\n'

大文字と小文字を区別しない一致の場合は、次に置き換えるpdf[pP][dD][fF]標準ではありませんがGNUおよびBSDでサポートされている)オプションを有効にし、オプションを変更または有効にすることができます。-name-inamefindzshextendedglobpdf(#i)pdfnocaseglob

おすすめ記事