2

Я пытаюсь написать bash-скрипт для вывода списка и сортировки подпапок по количеству элементов.

Вот что у меня есть:

find * | wc -l работает для возврата количества элементов.

И for f in *; do echo "$f"; find "$f" | wc -l ; done , но список трудно разобрать.

Поэтому я попытался использовать printf:

for f in *; do 
   c=`echo find "$f" | wc -l` ; 
   printf "$c $f\n"; 
done

Но он возвращает 1 для каждой подпапки.

И я хотел бы отсортировать окончательный список по количеству элементов в каждой подпапке.

2 ответа2

1

С руководством от localhost мое решение:

for f in */; do 
  c=$(find "$f" | wc -l) ; 
  printf "$c $f\n"; 
done | sort -n
1

Это заинтриговало меня, поэтому я попробовал, вот мой код:

#!/bin/bash

startIFS=$IFS
IFS=$'\n'

function echocount {
dirs=$(find -type d)
for f in $dirs; do
   c=$(find "$f" -maxdepth 1 -type f | wc -l) ;
   echo "$c $f";
done
}

echocount | sort -n

IFS=$startIFS

Я нахожу это очень глупым и раздражающим в сценариях оболочки, но мне нужно изменить IFS так, чтобы только новые строки, а не пробелы обозначали другой каталог, и цикл работал правильно.

Кстати, в вашем коде причина, по которой он всегда имел счет 1, заключается в том, что в echo find "$f" | wc -l , вы на самом деле подсчитываете строки в echo find "$f" , который всегда будет одной строкой (это просто буквально повторяет "find what", а не фактически запускает команду find). Если вы уберете echo , оно будет делать то, что вы ожидаете.

Кроме того, педанты скажут вам, что обратная нотация устарела. Я считаю, что запись $() более читабельна.

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