Tìm thấy đầu ra của liên quan đến thư mục


34

Tôi muốn sử dụng findđể liệt kê tất cả các tệp và thư mục theo cách đệ quy trong một gốc nhất định cho một cpiothao tác. Tuy nhiên, tôi không muốn thư mục gốc xuất hiện trong đường dẫn. Ví dụ: tôi hiện đang nhận được:

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

Nhưng, tôi muốn có được

file1
dir1
dir1/file2

(lưu ý rằng root cũng không nằm trong đầu ra mong muốn của tôi, nhưng điều đó dễ dàng bị loại bỏ tail).

Tôi đang dùng OS X và tôi không muốn cài đặt thêm bất kỳ công cụ nào (ví dụ như GNU find) nếu có thể, vì tôi muốn chia sẻ tập lệnh tôi đang viết với những người dùng OS X khác.

Tôi biết điều này có thể được thực hiện cutđể cắt danh sách gốc, nhưng đó có vẻ là một giải pháp tối ưu. Có một giải pháp tốt hơn có sẵn?


find diskimg/* | cut -d '/' -f2-
nik.shornikov

Câu trả lời:


18

Nếu những gì bạn đang cố gắng không quá phức tạp, bạn có thể thực hiện điều này với sed:

find diskimg | sed -n 's|^diskimg/||p'

Hoặc cut:

find diskimg | cut -sd / -f 2-

bạn có thể chọn (gần như) bất kỳ dấu phân cách nào cho lệnh, vì vậy: find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'(lưu ý tôi cũng đã thêm '-e' và một ^cách thực hành tốt (không cần thiết ở đây, vì bạn chắc chắn rằng mọi dòng sẽ có điều này ... nhưng vẫn thực hành tốt và lưu một số cpu;))
Olivier Dulac

một cách khác mà không có grep: find diskimg | sed -e 's|^diskimg/*||' ('/ *' sẽ khớp với bất kỳ số nào '/', thậm chí 0)
Olivier Dulac

Đây cutlệnh là sạch hơn so với cái tôi sử dụng; Tôi thích nó. ( sedGiải pháp cũng tốt, nhưng sự lặp lại diskimg/là một chút không may).
nneonneo

29

cd vào thư mục đầu tiên:

cd diskimg && find . 

Khi hoàn thành, bạn sẽ trở lại trong thư mục gốc của bạn.

Các tệp của bạn sẽ được thêm trước ./ trong trường hợp này; cách duy nhất tôi thấy xung quanh sẽ sử dụng cut:

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

Sử dụng một lớp con để tránh thay đổi thư mục hiện tại của shell của bạn (điều này không cần thiết nếu bạn đang đặt đầu ra là phía bên trái của một đường ống đã chạy trong một lớp con).

(cd diskimg && find .)

5
để trở lại trong thư mục gốc khi hoàn thành: thêm dấu ngoặc đơn : (cd diskimg && find . ; ). Bằng cách đó, việc cd diskimg && find .này được thực hiện trong một lớp con: khi lớp con đó thoát ra, bạn trở lại vỏ của chính mình, trong bất kỳ thư mục nào bạn có.
Olivier Dulac

1
find *là một cách khác xung quanh tiền tố vô dụng
nik.shornikov

23

Một cách khác, phức tạp hơn nhưng chỉ sử dụng phương pháp tìm từ câu trả lời khác của tôi:

find diskimg -mindepth 1 -printf '%P\n'

Không phải tất cả các phiên bản findhỗ trợ printf.
jordanm

1
Chắc chắn rồi; OSX của tôi không, có vẻ như. Một phần lý do tại sao tôi đưa ra một giải pháp khác.
Stephan

2
@Stephan - lần tới bạn chỉ có thể kết hợp các loại câu trả lời này thành một câu duy nhất. Không cần phải thực hiện nhiều câu trả lời cho phương sai như thế này.
slm

2
Chỉ findhỗ trợ GNU -printf, trong khi nhiều BSD findđã sao chép một số tính năng của GNU find, chưa có bản sao -printfnào được sao chép (AFAIK).
Stéphane Chazelas

các %Pcho các đường dẫn tương đối là những gì tôi cần.
Fl0v0

4

Sử dụng realpathtiện ích:

find diskimg -exec realpath --relative-to diskimg {} \;

Neat - cảm ơn đã chỉ cho tôi --relative-to.
nneonneo
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.