2012-04-30 2 views
1

Мне нужно определить, есть ли имена каталогов> 31 символ в заданной директории (т. Е. Посмотрите под этим корнем).Рекурсивно проверить длину имени каталога

Я знаю, что могу использовать что-то вроде find /path/to/root/dir -type d >> dirnames.txt

Это даст мне текстовый файл полных путей.

Мне нужно, чтобы получить фактическое количество символов в каждом имени каталога. Не уверен, что разбор приведенных выше результатов w/sed или awk имеет смысл. Ищете идеи/мысли/предложения/советы о том, как это сделать. Благодаря!

+1

Вы хотите только длину имени каталога или полный путь? – Sorpigal

ответ

0

Использование файла dirnames.txt созданный вашими find ЦМД, вы можете сортировать данные по длине имени пути, т.е.

awk '{print length($0) "\t" $0}' dirnames.txt | sort +0nr -1 > dirNamesWithSize.txt 

Это представит самые длинные имена путей (на основе значения длины) в верхней части файла.

Надеюсь, это поможет.

2

Этот короткий скрипт делает все это на одном дыхании, то есть находит все имена каталогов, а затем выводит любой которых больше 31 символов в длину (вместе с их длина в символах):

for d in `find /path/to/root/dir -type d -exec basename {} \;` ; do 
    len=$(echo $d | wc -c) 
    if [ $len -gt 31 ] ; then 
    echo "$d = $len characters" 
    fi 
done 
+1

Большое спасибо, это сделал трюк! –

0

Попробуйте

find . -type d -exec bash -c '[ $(wc -c <<<"${1##*/}") -gt 32 ] && echo "${1}"' -- {} \; 2>/dev/null 

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

Если то, что вы хотели, весь путь, а не последний компонент пути, а затем использовать это:

find . -type d | sed -e '/.\{32,\}/!d' 

Эта версия также имеет ошибку, но только тогда, когда имена файлов имеют встроенные переводы строк.

Результат обеих команд - это список имен файлов, которые соответствуют критериям. Подсчет длины каждого из них тривиален.

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