Làm cách nào tôi chỉ có thể buộc các đường dẫn tương đối trong đầu ra của Tìm kiếm?


25

Tôi đang cố gắng tạo một tập lệnh có thể nén các tệp có phần mở rộng nhất định trong một số thư mục thành một tar-ball duy nhất. Hiện tại những gì tôi có trong tập tin kịch bản là:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \;

Đâu $rootDirlà đường dẫn cơ sở để tìm kiếm.

Điều này là tốt, ngoại trừ các đường dẫn là tuyệt đối trong tập tin tar. Tôi muốn các đường dẫn có liên quan đến $rootDir. Tôi sẽ đi đâu để tới đó?

Ví dụ về hiện tại tar -tf docs.tarnơi $rootDir/home/username/testđầu ra:

home/username/test/subdir/test.doc
home/username/test/second.doc

Những gì tôi mong muốn đầu ra là:

./subdir/test.doc
./second.doc

Câu trả lời:


12

Nếu bạn chạy findtừ thư mục gốc mong muốn và không chỉ định điểm bắt đầu tuyệt đối trong findcác tùy chọn, nó sẽ xuất các đường dẫn tương đối đến các tarlệnh gọi mà nó xây dựng. Thích như vậy:

cd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;

Nếu bạn không muốn thay đổi thư mục làm việc hiện tại vĩnh viễn và đang sử dụng bashhoặc tương tự như trình bao của bạn, bạn có thể làm

pushd $rootDir
find . -name '*doc' -exec tar rvf docs.tar {} \;
popd

thay thế.

Lưu ý rằng Pushd / popd không có trong tất cả các shell, vì vậy hãy kiểm tra trang man cho phù hợp. Chúng có mặt trong bash nhưng không có trong triển khai sh cơ sở nên trong khi sử dụng rõ ràng /bin/bashbạn có thể dựa vào chúng, bạn không thể nếu kịch bản yêu cầu /bin/shthay thế (vì điều này có thể ánh xạ tới một vỏ nhỏ hơn không có cải tiến của bash)


Cảm ơn. Làm việc rực rỡ. Không nhận ra linux có Pushd / popd.
Shane

3
Hoặc chỉ sử dụng cd $rootDircd - (ít nhất là trong bash). ( cd $rootDir ; find ... )cũng có thể, tức là làm mọi thứ trong một khung con.
Daniel Beck

9

Bạn có thể sử dụng %Pđịnh dạng trong -printfchỉ thị:

find ${rootDir} -name '*.doc' -printf "%P\n"

sẽ hiển thị trong ví dụ của bạn:

subdir/test.doc
second.doc

Sau đó, bạn có thể sử dụng finddanh sách này trong một forbiểu thức, để chạy lệnh exec của chúng tôi, như trong:

for f in $( find ${rootDir} -name '*.doc' -printf "%P\n" );
do
    tar rvf docs.tar ${f}
done

1
Các giải pháp được chấp nhận hoạt động nhưng về cơ bản là một hack. IMHO đây sẽ là giải pháp phù hợp cho câu hỏi.
Narcolessico

Cảm ơn Narcolessico. Đó cũng là MHO :-)
Gabriel
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.