作者vgod (vgod)
标题单班计概作业五的解答
时间Tue Oct 31 18:52:28 2006
※ [本文转录自 vgod 信箱]
作者:
[email protected]
标题: Re: 改作业...
时间: Tue Oct 31 18:49:48 2006
作者: vgod (我只会更爱你) 看板: public_vgod
标题: Re: 改作业...
时间: Tue Oct 31 18:28:25 2006
计概作业终於改完了XD
(连续改作业没多久眼睛就会很酸, 这是变老的迹象吗 orz)
这次作业好像出太难了 导致小大一们怨声连连....
真正全对的也只有7个, 而且也不知道他们是不是真的都有弄懂自己在写甚麽XD
只是从作业里我也发现一些有趣的解法, 是之前完全没料到的XD
题目如下:
1. Pack and compress all C source files (*.c) in ~/hw/ into an archive file
and send it to a remote machine through a secure channel. Notice that ~/hw
has many nested directories, you should pack all C source files under ~/hw,
no matter how deep they are.
2. Try to do the same thing without creating a temporary file.
答案在下面, 不想看的不要下去:
1.
这题比较难的是要怎麽找出~/hw下所有的.c, 并且把这个list丢给tar或zip去压
我预设的答案是
tar cvzf hw.tgz `find ~/hw -name '*.c'`
而比较容易被忽略掉的是, *.c要包在quotes中, 不然会先被shell拿去展开
如果在current dir下刚好有.c, 就会烂掉XD
因为我没限制只能用tar, 所以有人用了zip
而zip有个有趣的参数-@, 可以从stdin吃进要压缩的list..
所以就可以变这样
find ~/hw -name '*.c' | zip -r hw.zip -@
但如果有仔细看man, 就会发现zip内建支援recursive pattern matching
(man中的例子竟然完全一样, 真是便宜有发现的人了XD)
zip -r hw.zip -i \*.c
同样的, 在*前加\的目的跟放quote里一样, 防止shell先把他展开
2.
第二题
难的地方在於要怎麽让tar(or zip)不要输出档案,
而把输出直接丢到另一台机器上存放
第一题可以用scp把hw.tgz直接复制到远端去
但scp不能从stdin吃data, 所以就不能直接把tar的输出pipe给scp
所以, scp不行 就得改用ssh了
ssh其实不是只能拿来连到工作站打逼或写程式而已
如果在ssh後面加command的话, ssh就能直接在远端机器上执行那个command
更厉害的是, ssh也能把pipe延伸到远端的command去.. 所以可以这麽写
tar cvzf - `find ~/hw -name '*.c'` | ssh linux2 ...
这样就能把tar的结果丢到远端去.
所以现在的问题是要怎麽把在远端stdin的资料存到一个档案里
最简单的方法就是 cat > hw.tgz
要特别注意的是, 不能直接写 ssh linux2 cat > hw.tgz
这样写的话, 本地端的shell会先把>给处理掉
於是最後的结果会存在本地端的hw.tgz, 而不是linux2上
同样的, 我们也得在>前面加上\ 或是用""把cat > hw.tgz整个包起来
避免shell先把它处理掉
以上是我预设的解法, 但後来发现竟然有人这麽写.....
tar cvzf linux2:hw.tgz `find ~/hw -name '*.c'`
刚看到的时候本来想直接给他错XD
但试了一下才发现... tar竟然真的有支援这麽恶心的功能 |||
(只是这要够新的tar才能用, 我本来用1.14会有问题 更新到1.16才ok)
因为我事先也没说不能用, 所以这样写的就还是算对了XD
--
"任何一个傻瓜都能写出计算机可以理解的程式码。唯有写出人类容易理解的程式码,
才是优秀的程式员。"
-- <<Refactoring>>
--
◢█◣▏◤█◣ ◆未来最旧小栈 Oldest Future Object
█●▇█▁˙█ ◆通讯频率 OfO.twbbs.org
◥█◢▉◥█◤ ◆来源座标
140.112.30.26
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.26
1F:推 bob0423:该怎麽说难呢......一片空白的东西...... 10/31 19:17
2F:推 vgod:如果有问题礼拜五请来演习课XD.. 10/31 19:33
3F:推 NTUSTKnight: ^^^^^^^^^^^^^^^^第一次上课吗? 10/31 20:11
4F:推 Acehole:我根本不知道要怎麽动手...整个就是囧在电脑前XD 10/31 20:23
5F:推 sasbluesea:因为已经订了火车票.不能去.. 10/31 21:04
6F:推 vgod:如果有人愿意提供录音设备, 可以录下来给没听到的人听... 11/01 00:35
7F:推 Asvaghosa:可以请老师提供吗 超高级iPod XD 11/01 15:52
8F:推 LeoSW:可以问一下这节演习课通常是教上次的作业吗? 11/04 00:04
9F:→ LeoSW:还是会视情况把礼拜一没教完的教玩呢? 11/04 00:05