Làm thế nào để tôi chỉ trả lại tên tệp từ lệnh find?


13

Tôi đang tìm kiếm một danh sách chỉ các tên tệp (không có phần còn lại của đường dẫn) khi thực hiện lệnh find từ một thiết bị đầu cuối. Làm thế nào để tôi thực hiện điều này trên mac?

Câu trả lời:



6

Evilsoup đã đề cập rằng những gì được đăng không hoạt động đối với các tên tệp cách nhau. Vì vậy, thay vào đó bạn có thể sử dụng:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

Điều này sẽ phá vỡ các tệp có khoảng trắng trong tên của chúng (xem phân tích ls trên wiki của greg)
evilsoup

+1 cho tốc độ. Tôi không biết mình đã làm gì sai, nhưng điều này mất 1 giây trên $ HOME của tôi, trong khi tất cả những người khác mất khoảng 10 giây. Tất nhiên, tôi sẽ cần hơn 10 giây để tìm kiếm nó và gõ nó.
Paulo Almeida

2

Với GNU find, bạn có thể làm:

 find ~/tmp/ -printf "%f\n"

Điều này có lẽ cũng đáng để thử trong OS X.


2
-printfkhông được hỗ trợ trên BSD OS X find.
Daniel Beck

1
Ngoài ra, -printfchịu ít liên quan đến printftiện ích shell C hoặc POSIX printf. Sử dụng tên hàm lịch sử này cho một cái gì đó khác nhau được xem xét rất kém. Các anh chàng BSD bảo thủ có thể sẽ nhìn thấy nó theo cùng một cách, vì vậy chúng tôi có lẽ sẽ không thấy bản sao của -printfBSD, dưới cái tên đó.
Kaz

Tôi không đồng ý rằng việc sử dụng một tên hàm quen thuộc để thực hiện một nhiệm vụ tương tự trong một bối cảnh khác nhau được coi là kém. Tại sao BSD có thể sẽ không bao giờ hỗ trợ nó là một vấn đề khác.
Ярослав Рахматуллин

2

Có một cách tốt hơn để loại bỏ mọi thứ trừ phần cuối của đường dẫn tệp; với awk. Sẽ tốt hơn vì awk không được thực thi một lần cho mỗi tệp. Trong một số trường hợp vấn đề này.

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

Chúng tôi chỉ tìm kiếm các tệp trong ~ / tmp và chúng tôi nhận được một danh sách trong đó mọi mục nhập được phân tách bằng dấu gạch chéo. Do đó, chúng tôi sử dụng dấu gạch chéo làm dấu tách trường (-F /) và in tham số trường ($ 1 .. $ 9) tương ứng với trường cuối cùng ($ NF).


Đây là cách nhanh nhất tôi đã thử nghiệm.
Paulo Almeida

Tôi đã sử dụng Cygwin thời gian gần đây, và tạo ra một quá trình trong cửa sổ là siêu đắt ...
Ярослав Рахматуллин

2

CHỈNH SỬA :

Sử dụng sed:

$ find . -type f | sed 's/.*\///'

Sử dụng lệnh xargs , như được đề cập trong phản hồi của @nerdwaller

$ find . -type f -print0 | xargs --null -n1 basename

1
Cảm ơn bạn đã chỉ ra rằng, +1, tôi đã không sử dụng xargs nhiều ... Chắc chắn là do bạn đã bỏ khá nhiều ký tự khỏi lệnh của tôi.
nerdwaller

Điều này phá vỡ khi các tập tin có không gian. Nó hoạt động như thế này, ít nhất là trong một thử nghiệm nhanh:find . -type f -print0| xargs --null -n1 basename
Paulo Almeida

Không có --nullhoặc -n1tùy chọn nào khả dụng trên OSX
Valeriy Van

1

Cái này thì sao:

find … | egrep -o -e '[^/]+$'

Ưu điểm: Chỉ có chính xác một quy trình bổ sung được sinh ra, không phải một quy trình cho mỗi kết quả.


0

Bạn có thể gọi shtừ trong -exectùy chọn của find và tránh sử dụng các đường ống không thông thường. Điều này cũng có lợi thế là bạn không cần phải lo lắng về tên tệp vui nhộn (dấu cách, dòng mới, v.v.):

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
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.