MIT 6.NULL The Missing Semester of Your CS Education(2)

Shell 工具和脚本

  1. 阅读 man ls ,然后使用ls 命令进行如下操作:
    所有文件(包括隐藏文件) :-a
    文件打印以人类可以理解的格式输出 (例如,使用454M 而不是 454279954) : -h
    文件以最近访问顺序排序:-t
    以彩色文本显示输出结果–color=auto
    典型输出如下:




在主目录下使用命令

ls -l -a -h -t --color=auto
  1. 编写两个bash函数 marco 和 polo 执行下面的操作。 每当你执行 marco 时,当前的工作目录应当以某种形式保存,当执行 polo 时,无论现在处在什么目录下,都应当 cd 回到当时执行 marco 的目录。 为了方便debug,你可以把代码写在单独的文件 marco.sh 中,并通过 source marco.sh命令,(重新)加载函数。通过source 来加载函数,随后可以在 bash 中直接使用。


编辑脚本
marco 函数将pwd命令的内容写入到文件marco_history.log中,并在屏幕上输出这个目录。
polo函数使用cd命令并读取刚才的marco_history.log文件。

在完成编辑脚本后,使用ls -l 命令查看该脚本的执行权限,这里本来时没有执行权限的需要通过chmod赋予执行权限,之后使用source命令,将脚本的内容存储在shell里。

source isa shell built-in command which is used to read and execute the content of a file(generally set of commands), passed as an argument in the current shell script.

上面是对source的定义,将读取和执行shell脚本的内容,并作为参数传递。

然后随机进入一个目录,然后使用marco打印出当前目录,再返回随机目录,并使用polo进入刚才的目录。

  1. 假设您有一个命令,它很少出错。因此为了在出错时能够对其进行调试,需要花费大量的时间重现错误并捕获输出。 编写一段bash脚本,运行如下的脚本直到它出错,将它的标准输出和标准错误流记录到文件,并在最后输出所有内容。 加分项:报告脚本在失败前共运行了多少次。


首先,n是0-99的一个数,其中用到了RANDOM函数。RANDOM 是 Bash 的一个内建函数(而不是常量),会返回一个在区间 [0, 32767] 内的整数,若超过5位可以加个固定10位整数,然后进行求余。

0表示标准输入
1表示标准输出
2表示标准错误输出

if语句,将n的结果与42对比,若相等:打印字符,并在标准错误中打印另一个字符串,退出。
否则打印正常运行的字符串。
在答案中给了while,for,until三种循环完成的脚本,其代码分别如下:
while 实现:

#!/usr/bin/env bash        
                           
count=1

while true
do
    ./buggy.sh 2 > out.log 
    if [[ $? -ne 0 ]]; then
       echo "failed after $count times"
        cat out.log        
        break
    fi
    ((count++))
done

for 实现

#!/usr/bin/env bash        
for ((count=1;;count++))   
do
    ./buggy.sh 2> out.log
    if [[ $? -ne 0 ]]; then             
        echo "failed after $count times"
        cat out.log        
        break              
    echo "$count try"
    fi
done

until实现

#!/usr/bin/env bash        
count=0                    
until [[ "$?" -ne 0 ]];    
do
    count=$((count+1))     
    ./buggy.sh 2> out.log
done

echo "found error affter $count runs"
cat out.log                  
  1. 本节课我们讲解的 find 命令中的 -exec 参数非常强大,它可以对我们查找的文件进行操作。但是,如果我们要对所有文件进行操作呢?例如创建一个zip压缩文件?我们已经知道,命令行可以从参数或标准输入接受输入。在用管道连接命令时,我们将标准输出和标准输入连接起来,但是有些命令,例如tar 则需要从参数接受输入。这里我们可以使用xargs 命令,它可以使用标准输入中的内容作为参数。 例如 ls | xargs rm 会删除当前目录中的所有文件。
    您的任务是编写一个命令,它可以递归地查找文件夹中所有的HTML文件,并将它们压缩成zip文件。注意,即使文件名中包含空格,您的命令也应该能够正确执行。

mkdir html_root
cd html_root
touch {1..10}.html
touch xxxx.html

输入以上命令创建所需的文件

然后要一次性创建html_root下所有html的一个压缩包,要用到的命令有find , xargs , tar命令
find命令的基本格式为find pathname -option [-print ] [ -exec | -ok command ] {};
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
tar命令是常用的压缩命令,常用的参数有:在这里插入图片描述

所以在这里用到的指令是

find . -type f -name "*.html" | xargs -d '\n'  tar -cvzf html.zip

将目录下的html文件先用find提取出来,并通过xargs用回车作为分割符分割并送入下一个压缩命令中作为参数。

5. (进阶)编写一个命令或脚本递归的查找文件夹中最近使用的文件。更通用的做法,你可以按照最近的使用时间列出文件吗?

find . -type f -print0 | xargs -0 ls -lt | head -1
  • find命令负责查找该文件夹及子文件夹下所有的文件并用xargs将其作为ls的参数,
  • ls命令按照时间排序并显示详细信息,
  • 然后将这些信息送入head命令中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alfred young

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值