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?
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:
Với tên cơ sở:
find . -type f -exec basename {} \;
;
chấm dứt -exec
hành động. Cái \
này là cần thiết vì ;
cũng có ý nghĩa đặc biệt với vỏ.
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
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.
-printf
không được hỗ trợ trên BSD OS X find
.
-printf
chịu ít liên quan đến printf
tiệ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 -printf
BSD, dưới cái tên đó.
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).
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
find . -type f -print0| xargs --null -n1 basename
--null
hoặc -n1
tùy chọn nào khả dụng trên OSX
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ả.