1

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

Вот что я сейчас делаю

num_files=$(find $directory -type f | wc -l)
num_directories=$(find $directory -type d | wc -l)
num_symlinks=$(find $directory -type l | wc -l)
num_hardlinks=$(find $directory -type f -links +1 | wc -l)

Как я могу получить эти четыре счетчика за один find ?

3 ответа3

3
find $directory -type d -exec echo dirs \; -o -type l -exec echo symlinks \; -o -type f -links +1 -exec echo hardlinks \; -o -type f -exec echo files \; | sort | uniq -c

Производит вывод как:

 326 dirs
2164 files
  40 hardlinks
 164 symlinks
2

Следующее должно сделать это. Требуется GNU find ; в OS X установите, например, findutil используя Homebrew.

find $directory -type d -printf d -o -type l -printf l -o -type f -links +1 -printf h -o -type f -printf f

Это напечатает один символ для каждой найденной записи файловой системы

  • d если это файл
  • l если это символическая ссылка
  • h если это файл с жесткими ссылками
  • f если это файл (только если не h)

Вывод выглядит так (фактическая выдержка из моей системы):

dfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdffffffffddfdffdfffffffffddfdldfllfdlldffffdfllfdlllllldffffdffffldfllfddffdldfddddffffflllldllllldlffffldfllfdlldffffdfllfddffddfddddfffffldfddddfffffdfddddfffffdlllldffffldfffflflllldffflfdffflfdfllfddffffldffffdfffflldfffflllldffffdffffdfffflldfllfddffdldfddddfffffdllllddflfffflldfllfddffffdffffdffffldffffdffffdffffdffffllldffffldffffdffffldffffldffffdffffdffffllllllldffffldffffdfffflllllldfffflldffddldfllfdldfffflldfffflldffffdfffflldffffdffffdfllfdlldfffflllldfllfdlldffffdfllfdlllllldffffdffdldfllfdlldfffflldfffflldffffldffffldfffflldfllfdldffffldffffldffdldffdddffddffddffddldfllfdlldffffdffffdfffflldfffflldffffdffffllldffffdffffdfllfddffffldfffflllldffffldfffflllldffffdfllfddffdldddddfffdddddfffdddddfffdddddfffdldlfffflldlffffllldfffllldffffdlffffdlffffldfffflldffdldfllfdllldffffdffffdffffldfllfdlllldfffflldfllfdldfddffffffl

Перенаправить вывод в файл, и тогда он станет простой обработкой строк, чтобы посчитать позже.

2

Используя ответ Дэниела Бека, я разработал следующее решение, которое должно работать для большинства версий find а также обеспечивает магию подсчета:

output=$(find $directory -type d -exec printf d \; -o -type l -exec printf l \; -o -type f -links +1 -exec printf h \; -o -type f -exec printf f \;)
num_files=$(echo $output | grep -o "f" | wc -l)
num_directories=$(echo $output | grep -o "d" | wc -l)
num_symlinks=$(echo $output | grep -o "l" | wc -l)
num_hardlinks=$(echo $output | grep -o "h" | wc -l)

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