Liệt kê tất cả các tệp trong một thư mục theo cách đệ quy nhưng tự loại trừ các thư mục


8

Câu hỏi đơn giản, tôi đang chạy lệnh find sau:

find . -type d \( -path ./.git -o   \
                  -path ./log -o    \
                  -path ./public -o \
                  -path ./tmp       \) \
                  -prune -o         \
                  -print

Để liệt kê tất cả các tệp trong thư mục của tôi, không bao gồm các thư mục được chỉ định.

Điều này hoạt động rất tốt, tuy nhiên, điều tôi muốn làm là loại trừ mọi thư mục thực tế khỏi đầu ra, vì vậy nếu có cấu trúc thư mục như sau:

test
  -- foo.text
  -- bar.text

Khi tôi chạy lệnh tôi muốn xem:

./test/foo.text
./test/bar.text

thay vì:

.
./test
./test/foo.text
./test/bar.text

Ai có thể giúp đỡ?


Tiêu đề không phù hợp với nội dung.
ctrl-alt-delor

Câu trả lời:


10
find . -type f

sẽ làm điều đó. Bạn có thể thực hiện nếu bạn muốn thao tác trên tên tệp.


có, nhưng tôi cần loại trừ tất cả các tệp trong các thư mục nhất định.
TheDelChop

-type flà cho các tập tin thường xuyên . thư mụctệp thông thường là 2 trong số nhiều loại tệp khác nhau trên Unix. Với -type f, bạn đang loại trừ các thư mục, mà còn tất cả các loại tệp khác như symlink, socket, fifos, thiết bị, cửa ...
Stéphane Chazelas

@ StéphaneChazelas, cửa ra vào ?
dùng1717828


6

Chỉ cần sử dụng ! -type d:

find . -type d \( -path ./.git -o \
                  -path ./log -o \
                  -path ./public -o \
                  -path ./tmp \) -prune -o \
       ! -type d -print

0

Đây là một cách để làm điều đó. Tôi đang chuyển đầu ra của bạn từ find(sử dụng xargs) sang một chút bash để đặt câu hỏi "Đây có phải là một thư mục không?" và nếu không, nó lặp lại thiết bị đầu cuối của bạn.

Đây là toàn bộ cô ấy:

find . -type d \( -path ./.git -o -path ./log -o -path ./public -o -path ./tmp \) -prune -o -print | xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'

Đây chỉ là sự bổ sung của tôi:

xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'

Giải thích:

xargs -i thay thế chuỗi "{}" bằng các đối số (những đối số được dẫn vào)

bash -c lệnh đọc từ chuỗi

if [ ! -d "{}"]; đây có phải là một thư mục

echo "{}" lặp lại kết quả tìm kiếm.

fi; kết thúc nếu.


Ở đó, bạn đang biến tên tệp thành mã shell. Con đường leo thang đặc quyền điển hình. Như người ta có thể tạo một tệp được gọi là $(do-what-I-want)ví dụ để bạn làm những gì anh ta muốn.
Stéphane Chazelas
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.