Làm cách nào để đếm riêng số lượng tệp, thư mục, liên kết tượng trưng và liên kết cứng trong một lần tìm kiếm?


1

Để kiểm tra di chuyển thành công tôi đang sử dụng findđể đếm số lượng tệp, thư mục, liên kết tượng trưng và tệp có nhiều hơn một liên kết cứng. Vì các thư mục để kiểm tra chứa một số lượng lớn tệp, mỗi lần findchạy mất vài giờ. Vì vậy, tôi tìm kiếm một cách để đếm riêng số lượng tệp, thư mục, liên kết tượng trưng và tệp có nhiều hơn một liên kết cứng trong một lần findchạy.

Đây là những gì tôi hiện đang làm

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)

Làm thế nào tôi có thể có được bốn quầy trong một lần findchạy?


Tôi không chắc đây là cách tiếp cận tốt nhất để so sánh hai thư mục. Bạn có chắc chắn đây là những gì bạn nên hỏi?
Daniel Beck

Cách tốt nhất để so sánh hai thư mục có lẽ là một cách nhanh chóng rsync. Nhưng tôi cần chứng minh rằng rsync đã sao chép tất cả các tệp, thư mục, liên kết tượng trưng và liên kết cứng và tôi không biết cách nào tốt hơn là thực hiện với find.
Florian Feldhaus

Câu trả lời:


2

Sau đây nên làm điều đó. Nó đòi hỏi GNU find; trên OS X, cài đặt, ví dụ như findutilsử dụng Homebrew.

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

Điều này sẽ in một ký tự cho mỗi mục nhập hệ thống tệp gặp phải:

  • d nếu đó là một tập tin
  • l nếu đó là một liên kết tượng trưng
  • h nếu đó là một tập tin với các liên kết cứng
  • fnếu đó là một tập tin (chỉ khi không h)

Đầu ra trông như thế này (trích đoạn thực tế trên hệ thống của tôi):

dfddfdfddfdfddfdfddfdfddfdfddfddfdfddfdffffffffddfdffdfffffffffddfdldfllfdlldffffdfllfdlllllldffffdffffldfllfddffdldfddddffffflllldllllldlffffldfllfdlldffffdfllfddffddfddddfffffldfddddfffffdfddddfffffdlllldffffldfffflflllldffflfdffflfdfllfddffffldffffdfffflldfffflllldffffdffffdfffflldfllfddffdldfddddfffffdllllddflfffflldfllfddffffdffffdffffldffffdffffdffffdffffllldffffldffffdffffldffffldffffdffffdffffllllllldffffldffffdfffflllllldfffflldffddldfllfdldfffflldfffflldffffdfffflldffffdffffdfllfdlldfffflllldfllfdlldffffdfllfdlllllldffffdffdldfllfdlldfffflldfffflldffffldffffldfffflldfllfdldffffldffffldffdldffdddffddffddffddldfllfdlldffffdffffdfffflldfffflldffffdffffllldffffdffffdfllfddffffldfffflllldffffldfffflllldffffdfllfddffdldddddfffdddddfffdddddfffdddddfffdldlfffflldlffffllldfffllldffffdlffffdlffffldfffflldffdldfllfdllldffffdffffdffffldfllfdlllldfffflldfllfdldfddffffffl

Chuyển hướng đầu ra đến một tệp, và sau đó nó trở thành xử lý chuỗi đơn giản để đếm sau.


Nó hoạt động tốt trên Mac OS X đối với tôi, nhưng thật không may, tôi phải chạy lệnh trên SunOS 5.10 khi tìm thấy không hỗ trợ printf. Bất kỳ đề xuất làm thế nào để đạt được cùng mà không cần printf?
Florian Feldhaus

@FlorianFeldhaus Bạn đang ở trên một Solaris gần một thập kỷ? Bạn có lẽ nên thêm nó vào câu hỏi của bạn. Khác với việc biên dịch và cài đặt tốt hơn find... không có ý tưởng. FWIW OS X findkhông không hỗ trợ -printf, bạn có thể cài đặt một cái gì đó tốt hơn rồi.
Daniel Beck

Vâng, tôi hiện phải sử dụng nó. Các công cụ trên đó không phải là cũ, nhưng Solaris findkhông hỗ trợ printf. Tôi sẽ cố gắng để có được một máy chủ Linux nơi tôi có một GNU gần đây find.
Florian Feldhaus

4
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

Sản xuất đầu ra như:

 326 dirs
2164 files
  40 hardlinks
 164 symlinks

2

Sử dụng câu trả lời từ Daniel Beck, tôi đã phát triển giải pháp sau đây phù hợp với hầu hết các phiên bản findvà cũng cung cấp phép thuật đếm:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.