$ 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修飾子を使用できます(zsh
macOSにデフォルトでインストールされており、既存でも使用されますsh
)。
#! /bin/zsh -
printf '%s\n' **/*.pdf(DoL)
**/
再帰的なワイルドカードです。(DoL)
D
ドットファイル(隠しファイル)を含み、結果のリストをファイルの長さでソートするために使用されるfind
globoL
修飾子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
-iname
find
zsh
extendedglob
pdf
(#i)pdf
nocaseglob