ファイルの検索方法、それらのファイルに関する標準的な情報の印刷方法、および各ファイル名の英字の文字数の印刷方法


0

私はこのようなものが欲しい:

find "$dir" -type f -printf '%i:<alpha_char_count_of_base_filename>:%d:%p\n'

それでは、最初にiノード番号、次にalpha_char_count_of_base_filenameの順に並べ替えます。私は解決策の一部を考え出したと思います。

私はこのコードでalpha_char_count_of_base_filenameを取得できることを知っています:

basename "$filename" | tr -cd [:alpha:] | wc -m

しかし、このようなことを試みても(笑わないで)うまくいきません。

find "$dir" -type f -printf '%i:$(basename -print | tr -cd [:alpha:] | wc -m):%d:%p\n'

私はたくさんのアイデアを試してみましたが、実用的な解決策を見つけたことはありません。これは私が試したもう一つのアイデアです:

find "$dir" -type f -printf '%i:%d:%p\n' | awk 'BEGIN{FS=":";OFS=":";} {print $1,system("basename "$3" | tr -cd [:alpha:] | wc -m"),$2,$3"\n";}'

これは私に近づいているように見えますが、間違った場所にalpha_char_count_of_base_filenameを表示します。私はそれが良いプログラミング形式であるという確信もありません。

私のシェルプログラミングの本では、この特定の問題に対する解決策を思いつくのに役立つものは何も提供していません。グーグルも(これまで)いません。

これはの解決策として使用されます この質問

回答:


2
find "$dir" -type f -printf '%i:%f:%d:%p\n' | 
awk -F: -v OFS=: '{n=$2; gsub(/[^[:alpha:]]/,"",n); $2=length(n); print}'

うーん、一時変数は必要ありません:

awk -F: -v OFS=: '{gsub(/[^[:alpha:]]/,"",$2); $2=length($2); print}'

ありがとうございます。唯一の問題は、希望するベース名(ファイル名のみ)ではなく、パス全体のアルファカウントを取得していることです。
MountainX

私はこれと一緒に暮らすことができると思います。ありがとうございました。ベースネームの答えが出てこなければ、私はこの答えを受け入れます。
MountainX

@MountainX、ベース名だけを使うように私の答えを更新しました - それはを使います %f ベース名をawkに送り、そこで「アルファ長」に置き換えられるフォーマット指定子
glenn jackman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.