2012-02-08 30 views
18

Tôi đang sử dụng lệnh tìm trong tập lệnh ksh và tôi đang cố truy xuất chỉ các tên tệp chứ không phải đường dẫn đầy đủ. Như trong, tôi muốn nó trả về text.exe, không //severname/dir1/dir2/text.exe.Tìm chỉ in tên tệp, chứ không phải đường dẫn đầy đủ

Làm cách nào để tôi thực hiện điều đó? Để làm rõ, tôi biết các thư mục các tập tin được in, tôi chỉ grabbing những người tạo ra befoee một ceetain ngày, do đó, pathname không quan trọng.

+2

có thể trùng lặp của [Cách chỉ nhận tên tệp bằng linux \ 'find \'?] (Http://stackoverflow.com/questions/5456120/how-to-only-get-file-name- with-linux-find) – BroSlow

+0

Điều này cũng đã được trả lời [ở đây] (http://stackoverflow.com/questions/5456120/how-to-only-get-file-name-with-linux-find). – sebastian

+0

nhiều bản sao cho một https://serverfault.com/questions/354403/remove-path-from-find-command-output – michael

Trả lời

6

bạn có thể làm điều đó với:

find ..... |sed 's#.*/##' 

tuy nhiên nó thực sự có ý nghĩa? nếu có hai tệp có cùng tên tệp nhưng nằm trong các thư mục khác nhau, bạn có thể phân biệt chúng như thế nào?

ví dụ:

you are in /foo 

/foo/a.txt 
/foo/bar/a.txt 

EDIT

chỉnh sửa câu trả lời cho đạt được một số định dạng văn bản tốt hơn.

Như bạn mô tả trong bình luận, do đó bạn muốn

  1. tìm thấy một số tác phẩm,
  2. sao chép chúng vào một thư mục,
  3. gzip chúng vào một kho lưu trữ nói a.gz
  4. remove sao chép chỉ các tệp nếu bước 2 thành công

Điều này có thể được thực hiện trong một lần chụp:

find ...|xargs tar -czf /path/to/your/target/a.gz 

điều này sẽ tìm tệp, tạo tar (a.gz) cho thư mục tiêu của bạn.

+0

Vâng, tôi đang sử dụng tìm kiếm vì tôi đang cố gắng lấy tất cả các tệp được tạo sau một ngày nhất định, sử dụng -mtime. Có cách nào tốt hơn? – Steve

+0

@Steve bạn sẽ làm gì với những tệp bạn tìm thấy bằng cách 'tìm kiếm'? có yêu cầu cụ thể nào về việc xóa thông tin thư mục không? – Kent

+1

vâng tôi sẽ sao chép chúng vào một thư mục khác và sau đó thực hiện các công cụ với chúng, vì vậy tất cả những gì tôi muốn là tên tệp thực. Nếu không, tôi phải chạy lại Find. – Steve

8
find ... -exec basename {} \; 

cũng sẽ thực hiện thủ thuật .. nhưng như @Kent hỏi, tại sao bạn lại muốn điều này?

+0

Sử dụng '-exec' như trong câu trả lời này chạy một chương trình bên ngoài cho mỗi tệp được tìm thấy. Câu trả lời của @ glennjackman bằng cách sử dụng tùy chọn '-printf' có thể nhanh hơn nhiều, tùy thuộc vào số lượng tệp và hệ điều hành. –

+0

@ StéphaneGourichon Đây là câu trả lời hay cho các hệ thống không phải GNU. Không có '-printf' trong OpenBSD' find' – sheepdog

+0

Ngoài ra (nhưng không nhất thiết áp dụng cho non-GNU), có một tùy chọn 'basename -a' cho phép truyền trong nhiều arg, và một tùy chọn' find' cho phép truyền vào nhiều args đến '-exec', vì vậy nếu hiệu suất thực sự là một vấn đề, điều này có thể giúp:' find ... -exec basename -a {} + '(lưu ý' + 'thay vì' \; ') – michael

51

Nếu bạn đang sử dụng GNU tìm kiếm, sau đó

find path -printf "%f\n" 

sẽ chỉ in tên tập tin và loại trừ các con đường.

2

Đây là một câu trả lời khác.

find | awk -F/ '{print $NF}'  
Các vấn đề liên quan