Я хочу что-то вроде этого:

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_file в неправильном месте. Я также не уверен, что это хорошая форма программирования.

Моя книга по программированию оболочки не предлагает мне ничего, что помогло бы мне найти решение этого конкретного вопроса. Так же как и Google (пока).

Это будет использоваться в качестве решения этого вопроса.

1 ответ1

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

хммм, не нужна переменная temp:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .