Làm thế nào để thoát khỏi hàng đầu.


140
find . -type f -print

in ra

./file1
./file2
./file3

Bất cứ cách nào để làm cho nó in

file1
file2
file3

?


1
nếu bạn sử dụng -exec /path/to/myscript.sh {} trong của bạn find, -printf '%P\n'thì không hoạt động. Thay vào đó, tôi phải thực hiện ./tiền tố nhai trong kịch bản bằng cách:p=${1#"./"}
Truthadjustr

Nếu bạn đang làm điều đó chỉ cho một tệp duy nhất:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Câu trả lời:


38

Nếu chúng chỉ trong thư mục hiện tại

find * -type f -print

Đó là điều bạn muốn?


21
Điều này sẽ bỏ lỡ các tập tin với tên bắt đầu bằng một khoảng thời gian.
Sean

2
Xấu, tùy thuộc vào cài đặt shell * có thể không đánh giá các tệp / thư mục "ẩn" - những tệp bắt đầu bằng dấu chấm (.) Hãy thử chạy lệnh này trong thư mục nhà của bạn, sau đó chỉ cần "find -type f" và xem sự khác biệt .
Ilia K.

35
Một mối quan tâm phù hợp hơn là '*' được đánh giá bởi trình bao. Bạn thực sự có một loại tình huống tiêm mã độc. Sẽ thật tầm thường khi tạo một tệp có tên '--exec rm' và một tệp khác có tên 'zzzz;'. Tạm biệt tập tin.
CWF

6
Điều này là không an toàn. Nếu một tên tệp bắt đầu bằng dấu gạch ngang, nó sẽ được coi là một tùy chọn để tìm và có thể thất bại hoặc có khả năng gây thiệt hại.
Dale Anderson

4
Tại sao -printcần thiết? Nó đã cho kết quả tương tự mà không có cờ đó.
dùng13107

239

Chỉ tìm các tệp thông thường trong thư mục hiện tại và in chúng mà không có ./tiền tố "":

find -type f -printf '%P\n'

Từ người đàn ông tìm, mô tả -printfđịnh dạng:

Tên tệp% P với tên của đối số dòng lệnh mà theo đó nó được tìm thấy đã bị xóa.


18
+1 Giải pháp tốt nếu phiên bản findhỗ trợ của bạn -printf(không phải tất cả đều được).
Todd Owen

2
Như Todd đã nói, nhưng chính xác hơn: đó không phải là POSIX 7.
Ciro Santilli 郝海东 冠状 病

8
Được hỗ trợ hay không, nó chắc chắn an toàn hơn câu trả lời được chấp nhận.
Dale Anderson

10
Bạn có thể sử dụng \0thay vì \nnếu bạn muốn ống nó xargs -0(ví dụ trong trường hợp tên tập tin chứa khoảng trắng), ví dụ:find -type f -printf '%P\0' | xargs -0 head
seanf

1
@Quanlong, nó hoạt động trên macOS nếu bạn brew install findutils;)
blockloop

58

Sử dụng sed

find . | sed "s|^\./||"

2
Đây là giải pháp ưa thích của tôi; nó tương thích POSIX (hoạt động thực tế ở mọi nơi, ngay cả các hệ thống nhúng), rất ngắn và không có khả năng dẫn đến hành vi không mong muốn. Đây phải là câu trả lời được chấp nhận.
Jody Bruchon

6
Làm thế nào điều này sẽ được kết hợp với find -exec?
Paul Wintz

find -exec sh -c "echo {} | sed 's|^\./||'" \; hoặc find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

nó có thể ngắn hơn

find * -type f

Tốt hơn 2> /dev/nulllà bỏ qua lỗi được báo cáo khi lệnh được chạy trong một thư mục trống.
neevek

2

Một cách khác để tước ./là bằng cách sử dụng cutnhư:

find -type f | cut -c3-

Giải thích thêm có thể được tìm thấy ở đây


2

Một cách khác để tước ./

find * -type d -maxdepth 0

Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do giải quyết vấn đề này thực sự sẽ giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều lượt bình chọn hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
David Buck

2

-printftùy chọn không khả dụng trên OSX, findđây là một lệnh hoạt động trên OSX find, chỉ trong trường hợp nếu ai đó không muốn cài đặt gnu findbằng brewv.v.

find . -type f -execdir printf '%s\n' {} + 

1
Thật không may, điều này tước toàn bộ đường dẫn của mỗi tệp được tìm thấy, bao gồm các thư mục con trung gian và chỉ in tên tệp.
PLL

1
Bạn đúng rồi. Giải pháp này chỉ tốt cho các tập tin trong thư mục hiện tại. Đối với các tệp lồng nhau, chúng ta cần sử dụng:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
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.