2013-12-10 3 views
0

Я боролся в течение нескольких часов, чтобы получить эту uggly линия работатьпечать рекурсивно количество файлов в папках

wcr() { find "[email protected]" -type d | while read F; do find $F -maxdepth 0 && printf "%5d " $(ls $F | wc) && printf "$F"; done; echo; } 

Вот результат

39 41 754 ../matlab.sh 
1 1 19 ./matlab.sh./micmac 
1 1 14 ./micmac 

Мой первый вопрос: как я могу писать умнее?

Второй вопрос: Я хотел бы имена, напечатанные до подсчетов, но я не знаю, как пластинчатые выходы, так что я не могу сделать лучше, чем это:

. 
./matlab.sh 1 1 19 
./matlab.sh./micmac 1 1 19 
./micmac 1 1 14 
+0

Таблицы? Вы имеете в виду выравнивание столбцов? Считаете ли вы, что это будет выглядеть очень уродливо, если только одно значение в первом столбце очень длинное? – Alfe

ответ

3
  1. Я не вижу, что это find $F -maxdepth 0 должен быть хорош, поэтому я бы просто разделил его.
  2. Кроме того, если имя файла содержит %, у вас возникают проблемы, если вы используете его как строку формата для printf, поэтому я бы добавил строку форматированного формата. И я объединил два printf с. Чтобы переключить столбцы (см. Также ниже, чтобы узнать больше об этой теме), просто переключите аргументы и соответствующим образом скопируйте строку формата.
  3. Вы должны использовать двойные кавычки с использованием переменных ("$F" вместо $F), чтобы избежать проблем с именами файлов с пробелами или другими предметами в них.
  4. Затем, если файл начинается с пробелов, ваш read будет пропускать те, что делает полученную переменную бесполезной. Чтобы этого избежать, установите IFS в пустую строку на время чтения.
  5. Чтобы получить только количество записей в каталоге, вы должны использовать опцию -l для wc, чтобы считать только строки (а не слова и символы).
  6. Используйте опцию --sort=none до ls, чтобы ускорить работу, избегая бесполезной сортировки.
  7. Используйте опцию -b до ls, чтобы избежать символов новой строки в именах файлов и, таким образом, избежать нарушения подсчета.
  8. Отредактируйте свой код правильно, если вы хотите, чтобы другие его читали.

Это результат:

wcr() { 
    find "[email protected]" -type d | while IFS='' read F 
    do 
     printf "%5d %s\n" "$(ls --sort=none -b "$F" | wc -l)" "$F" 
    done 
    echo 
} 

Я бы возражать против включения колонок. Потенциально самый широкий столбец должен быть в конце (в этом случае путь к файлу). В противном случае вам придется жить с нечитаемым выходом. Но если вы действительно хотите это сделать, вам придется сделать два прохода: один для определения самой длинной записи и второй для форматирования вывода соответственно.

+0

Спасибо за подробные ответы и все советы. Я считаю, что скрипты bash намного сложнее, чем любые другие языки, которые я изучил раньше. Надеюсь, я смогу немного пообщаться. – quickbug

+1

Спасибо за подробные ответы и все советы. Я считаю, что скрипты bash намного сложнее, чем любые другие языки, которые я изучил раньше. Надеюсь, я смогу немного пообщаться. Вот почему я изо всех сил пытаюсь получить какую-то рабочую вещь, прежде чем искать помощь в stackoverflow;) – quickbug

1
for i in $(find . -type d); do 
    printf '%-10s %s\n' "$(ls $i | wc -l)" "$i" 
done 

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

+0

Ваша команда будет отключена, когда каталог содержит пробельное имя. – Bernhard

+0

Спасибо за трюк «колонны». Я добавил его в закладки для последующего использования. – quickbug

Смежные вопросы