2009-07-25 38 views
8

Tôi mới dùng sed và chỉ cần lấy tên tệp từ đầu ra của find. Tôi cần phải tìm đầu ra toàn bộ đường dẫn cho một phần khác của kịch bản của tôi, nhưng tôi muốn chỉ in tên tệp mà không có đường dẫn. Tôi cũng cần phải khớp với bắt đầu từ đầu của dòng, không phải từ cuối. Trong tiếng Anh, tôi muốn khớp, nhóm ký tự đầu tiên kết thúc bằng ".txt" không chứa "/". Đây là nỗ lực của tôi không hoạt động:Sử dụng sed để lấy tên tập tin từ đường dẫn đầy đủ?

[email protected]:~$ find /home/ryan/Desktop/test/ -type f -name \*.txt 
/home/ryan/Desktop/test/two.txt 
/home/ryan/Desktop/test/one.txt 
[email protected]:~$ find /home/ryan/Desktop/test/ -type f -name \*.txt | sed s:^.*/[^*.txt]::g 
esktop/test/two.txt 
ne.txt 

Dưới đây là kết quả tôi muốn:

two.txt 
one.txt 

Ok, vì vậy các giải pháp đưa ra đã trả lời câu hỏi ban đầu của tôi, nhưng tôi đoán tôi hỏi nó sai. Tôi không muốn giết phần còn lại của dòng qua hậu tố tập tin mà tôi đang tìm kiếm. Vì vậy, để được rõ ràng hơn, nếu như sau:

bash$ new_mp3s=\`find mp3Dir -type f -name \*.mp3\` && cp -rfv $new_mp3s dest 
`/mp3Dir/one.mp3' -> `/dest/one.mp3' 
`/mp3Dir/two.mp3' -> `/dest/two.mp3' 

Những gì tôi muốn là:

bash$ new_mp3s=\`find mp3Dir -type f -name \*.mp3\` && cp -rfv $new_mp3s dest | sed ??? 
`one.mp3' -> `/dest' 
`two.mp3' -> `/dest' 

Xin lỗi vì sự nhầm lẫn. Câu hỏi ban đầu của tôi chỉ đề cập đến phần đầu tiên của những gì tôi đang cố gắng làm.

2nd chỉnh sửa: đây là những gì tôi đã đi lên với:

DEST=/tmp && cp -rfv `find /mp3Dir -type f -name \*.mp3` $DEST | sed -e 's:[^\`].*/::' -e "s:$: -> $DEST:" 

Đây không phải là khá những gì tôi muốn mặc dù. Thay vì thiết lập thư mục đích dưới dạng biến shell, tôi muốn thay đổi hoạt động đầu tiên của sed để nó chỉ thay đổi đầu ra cp trước "->" trên mỗi dòng, do đó tôi vẫn có phần thứ 2 của đầu ra cp hoạt động với một '-e' khác.

3rd chỉnh sửa: tôi đã không figured này ra chỉ sử dụng sed regex của bài viết nào, nhưng sau không được công việc sử dụng Perl:

cp -rfv `find /mp3Dir -type f -name \*.mp3` /tmp | perl -pe "s:.*/(.*.mp3).*\`(.*/).*.mp3\'$:\$1 -> \$2:" 

Tôi muốn làm điều đó trong sed mặc dù.

Trả lời

7

Something như thế này nên làm như lừa:

find yourdir -type f -name \*.txt | sed 's/.*\///' 

hay, hơi rõ ràng hơn,

find yourdir -type f -name \*.txt | sed 's:.*/::' 
15

Tại sao bạn không sử dụng tên cơ sở thay thế?

find /mydir | xargs -I{} basename {} 
+1

Và người bạn, tên thư mục của nó. Sẽ là tuyệt vời nếu bạn cho thấy một ví dụ làm việc sử dụng các chi tiết được cung cấp trong câu hỏi. –

+0

Tôi chưa bao giờ nghe đến tên cơ sở, và tôi rất vui vì tôi đã biết về nó ngay bây giờ, nhưng tôi đã hy vọng một số trợ giúp regex sed. –

0
find /mydir | awk -F'/' '{print $NF}' 
8

Không cần các công cụ bên ngoài nếu sử dụng GNU tìm

find /path -name "*.txt" -printf "%f\n" 
+0

Làm thế nào tôi không biết về điều này?!? Đây là một tính năng cực kỳ tiện dụng để biết. Cảm ơn bạn! Phân tách các thư mục bằng 'find/path -name" * .txt "-printf"% h \ n "' – whereisalext

-2
path="parentdir2/parentdir1/parentdir0/dir/FileName" 
    name=${path##/*} 
Các vấn đề liên quan