Tìm thư mục không chứa thư mục con


10

Tôi đang viết kịch bản là ksh. Cần tìm tất cả các tên thư mục ngay dưới thư mục hiện tại chỉ chứa các tệp, không chứa các thư mục con.

Tôi biết rằng tôi có thể sử dụng ls -alRvà phân tích cú pháp đầu ra cho chữ cái đầu tiên trong trường đầu tiên ( dcho một thư mục). Tôi nghĩ awklà cách tốt nhất để phân tích và tìm kiếm.

Ví dụ, một ls -alđầu ra đơn giản trong thư mục hiện tại:

   drwxr-xr-x  22 af      staff    748 18 Mar 22:21 .
   drwxr-xr-x   5 root    admin    170 17 Mar 18:03 ..
   -rw-------   1 af      staff      3 17 Mar 16:37 .CFUserTextEncoding
   drwxr-xr-x   5 af      staff    170 17 Mar 17:12 Public
   drwxr-xr-x   9 af      staff    306 18 Mar 17:40 Sites
   -rw-------   1 af      staff      3 17 Mar 16:37 textd
   

Có 2 thư mục trong đầu ra này: PublicSites. Thư Publicmục không chứa thư mục con, nhưng Siteskhông. Có 3 thư mục con trong Sites. Vì vậy, tôi chỉ cần lặp lại các thư mục không chứa các thư mục trong đó. Trong trường hợp của tôi, đây chỉ là Sites.

Câu trả lời:


1

Bạn không cần phải sử dụng awktất cả. Sử dụng các bài kiểm tra tích hợp kshcung cấp, đại loại như thế này:

#!/bin/ksh

for NAME in *
do
    FOUND=no
    if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]]
    then
        for SUBNAME in $NAME/*
        do
            if [[ -d $SUBNAME ]]
            then
                FOUND=yes
                break
            fi
        done
        if [[ $FOUND == no ]]
        then
            echo Found only files in $NAME
        fi
    fi
done

Kịch bản nhỏ đó tìm trong tất cả các thư mục trong thư mục hiện tại và cho bạn biết nếu chúng chỉ chứa các tệp, không có thư mục con.


14

Nếu bạn có thể sử dụng findvà nếu bạn đang làm việc trên một "hệ thống tập tin Unix bình thường" (nghĩa là, như được định nghĩa trong find (1) dưới mô tả tùy chọn -noleaf ), thì có thể sử dụng lệnh sau:

find . -type d -links 2

Mỗi thư mục có ít nhất 2 tên (liên kết cứng): .và tên của nó. Các thư mục con của nó, nếu có, sẽ có một ..trỏ đến thư mục mẹ, vì vậy một thư mục có N thư mục con sẽ có số lượng liên kết cứng bằng N + 2. Do đó, tìm kiếm các thư mục có số lượng liên kết cứng bằng 2, chúng tôi tìm kiếm các thư mục có thư mục con N = 0.

Vì vậy, nếu bạn có thể sử dụng find, đây được cho là phương pháp nhanh nhất và rõ ràng là vượt trội so với các vòng lặp trong vỏ so với nội dung thư mụcstat() của mỗi thành viên.


Điều này dường như không hoạt động nếu thư mục chứa bất kỳ tập tin.
dùng394

1
Đây không phải là về các mục trong danh sách thư mục, mà là về các liên kết cứng đề cập đến inode của thư mục. Ví dụ: nếu /some/directorycó inode # 12345678, nếu nó không có thư mục con, sẽ có chính xác 2 liên kết cứng đến inode đó: /some/directory/./some/directory. Nó hoạt động cho dù có bất kỳ tập tin trong thư mục.
telcoM

Đáng nói là BTRFS không phải là một "hệ thống tập tin Unix bình thường" về mặt này: các thư mục luôn có số lượng liên kết là 1, thật không may. (Nhưng .foo/..có cùng số inode.)
Peter Cordes

3

*/phù hợp với các thư mục con của thư mục hiện tại. Điều này bao gồm các liên kết tượng trưng đến các thư mục mà bạn có thể hoặc không muốn.

Trong ksh93, thêm ~(N) vào đầu mẫu sẽ khiến nó mở rộng sang danh sách trống nếu không có kết quả khớp. Không có điều này, mô hình vẫn không thay đổi nếu không có kết quả khớp.

Hàm ksh93 sau đây liệt kê các thư mục con của các thư mục hiện tại không chứa bất kỳ thư mục con hoặc liên kết đến một thư mục.

list_leaf_directories () {
  local FIGNORE='.?(.)'        # don't ignore dot files
  local d
  for d in */; do
    [[ -L $d ]] || continue;   # skip symbolic links
    set -- ~(N)"$d"/*/
    if ((!$#)); then echo "$d"; fi
  done
done

0

Nếu tôi không hiểu lầm bạn, bạn chỉ muốn tìm tệp trong thư mục chứ không phải thư mục con. Nếu đây là ý định của bạn, đây là giải pháp

find . -type f

nếu bạn muốn tìm các tệp khác ngoài tệp thông thường (như tệp thiết bị khối, tệp thiết bị ký tự, v.v.) thì hãy xem trang man để biết findlệnh và tìm từ khóa loại trên trang đó. Bạn sẽ thấy các kiểu tệp khác nhau, bao gồm các tệp và thư mục thông thường, v.v.

Hy vọng đây là những gì bạn đang tìm kiếm


Không, đó không phải là câu hỏi. Nó hợp lý rõ ràng một khi bạn s / catalog / thư mục / g. Nat Kup đang tìm kiếm các thư mục không chứa thư mục con.
Gilles 'SO- ngừng trở nên xấu xa'
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.