2013-03-20 37 views
6

Đây KHÔNG phải là câu hỏi về bài tập về nhà, đây là câu hỏi từ kỳ thi cũ, vì vậy bất kỳ ai trả lời sẽ không đóng góp vào sự không trung thực trong học tập. Đối với những người vẫn còn hoài nghi, tôi chỉ đơn giản là tìm kiếm những gì lệnh tôi có thể sử dụng cho việc này.Mèo một tập tin Nhiều lần Không có vòng lặp

Bạn có tệp có tên one_mb có kích thước chính xác là 1 megabyte. Bạn muốn tạo từ một tệp có kích thước chính xác là 128 megabyte. Vui lòng viết một kịch bản lệnh shell để thực hiện điều này với tối đa 9 dòng và không có vòng lặp nào, nếu câu lệnh, đệ quy hoặc bất kỳ cấu trúc điều khiển logic nào khác. Mỗi lệnh, bao gồm các tham số, phải có độ dài nhỏ hơn 100 ký tự.

Tôi bắt đầu nghiên cứu xarg, nhưng không thể tìm ra cách tốt để sử dụng nó để thực hiện điều này.

Trả lời

12

Giả sử bash, bạn có thể sử dụng một dòng mở rộng cú đúp hack:

cat one_mb{,}{,}{,}{,}{,}{,}{,} > 128_mb 
+0

Tôi nghĩ có thể an toàn khi giả sử bash vì câu hỏi có thẻ 'bash'. Nhưng, nếu tôi đã đánh dấu điều này, tôi cũng có thể cất cánh nhãn hiệu cho một thông minh-a ** :-) Không, không thực sự, tốt hack. – paxdiablo

4

Gợi ý lớn ở đây là nó có thể là "không quá 9 dòng". Kể từ khi 2^7 = 128, bạn chỉ cần kích đúp của tập tin kích thước 7 lần:

cat one_mb one_mb > two_mb 
cat two_mb two_mb > four_mb 
... 
cat 64_mb 64_mb > 128_mb 
+0

tôi tò mò tại sao họ đã được đưa ra 9 lệnh, sau đó, thay vì 7. Phòng cho lỗi, tôi đoán :) – chepner

+1

có thể là: dòng 1: shebang, dòng 2-8: mã ở trên, dòng 9: dọn dẹp .. (xóa các tệp tạm thời) – mariux

+0

Đây là phương pháp phổ biến. –

4

Tại 100 ký tự trên mỗi lệnh, bạn có thể giảm nó khá một chút:

cat one_mb one_mb one_mb one_mb one_mb one_mb one_mb one_mb >mb8 
cat mb8 mb8 mb8 mb8 >mb32 
cat mb32 mb32 mb32 mb32 >mb128 
rm -f mb8 mb32 
6

Không chắc nếu điều này đếm, nhưng điều này lóe lên trong óc:

seq 1 128 | xargs -Inone cat one_mb >> 128_mb 

Không sử dụng vòng lặp nào, chỉ cần một đường ống và xargs.

+0

Cảm ơn bạn đã sử dụng xargs, vẫn không thấy nó hoạt động như thế nào, nhưng đó là một dòng chữ khá đơn giản –

+0

Lệnh đơn giản này có thể giúp bạn hiểu những gì đang diễn ra tốt hơn một chút: 'seq 1 10 | xargs -I {} echo Thực hiện {} 'Ngoài ra, hãy xem các trang người dùng xargs! – Rain

+0

Cảm ơn bạn đã phiên bản đơn giản. Tôi không có ý định yêu cầu làm rõ, tôi tuân theo luật RTFM, vì vậy tôi đã đọc trang người đàn ông, nhưng có các ví dụ giúp làm rõ hơn mô tả cấp cao về chức năng. –

2
dd oflag=append conv=notrunc if=/dev/zero of=one_mb bs=1MB count=127 

Điều này sẽ giữ lại nội dung tệp và thêm một nhóm các bản ghi "0" để tạo 128 MB. Do

ls -ltrh one_mb 

để kiểm tra xem đó có thực là 128MB hay không, bạn có thể phải thay đổi thông số "count = 127".

-1

Tôi nghĩ điều đó là đủ với những ràng buộc bạn có. Bạn có thể định nghĩa một hàm lấy một số nguyên làm tham số. Nếu nó lớn hơn 0, cat s tệp và gọi lại cùng một hàm, nhưng với thông số đã giảm.

Sau đó, bạn chỉ cần gọi hàm với giá trị cần thiết và bạn đã hoàn tất.

Tốt ol' đệ quy :)

(Xin lỗi, quá lười biếng để mã hóa, và có rất nhiều câu trả lời làm việc khác, chỉ muốn tránh đệ quy được quên :))

+0

"Hãy viết kịch bản lệnh shell để thực hiện điều này với tối đa 9 dòng và ** không có vòng lặp **, nếu câu lệnh, ** đệ quy ** hoặc bất kỳ cấu trúc điều khiển logic nào khác". – chepner

+1

Nó đã được __really__ quá muộn, tôi nghĩ rằng "nếu tuyên bố, đệ quy, vv" được cho phép. Lỗi của tôi. – mgarciaisaia

Các vấn đề liên quan