我想要这样的东西:
find "$dir" -type f -printf '%i:<alpha_char_count_of_base_filename>:%d:%p\n'
然后我想先按 inode 编号排序,然后按 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。我也不确定这是否是好的编程形式。
我的 shell 编程书没有提供任何可以帮助我找到这个特定问题的解决方案的内容。Google 也没有(到目前为止)。
这将被用来作为解决方案这个问题。
答案1
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}'