Linus程序設計作业
第一次作业
1 用命令完成以下功能(写出对应的命令,要求命令尽可能简单)
- 将当前目录下所有文件备份并压缩成 tar.gz,如果成功再将备份拷贝到
/backup 目录下。这个命令有两个部分,用 && 连接起来。第一部分是1
tar -czvf backup.tar.gz . && cp backup.tar.gz /backup
tar -czvf backup.tar.gz
.,它的作用是将当前目录下的所有文件和子目录压缩成backup.tar.gz
文件。这个命令中的选项解释如下:
- -c 表示创建一个新的 tar 文件。
- -z 表示使用 gzip 压缩。
- -v 表示显示详细的进度信息。
- -f 表示指定压缩后的文件名。
. 表示当前目录,也就是要备份的文件所在的目录。
第二部分是 cp backup.tar.gz /backup
,它的作用是将备份文件拷贝到 /backup
目录下。cp 是拷贝命令,backup.tar.gz
是要拷贝的文件,/backup
是目标目录。
如果以上命令成功执行,将在当前目录下生成一个名为 backup.tar.gz
的文件,并将该文件拷贝到 /backup 目录下。
- 将上述备份压缩后的文件解压到原来的目录这个命令中的选项解释如下:
1
tar -xzvf backup.tar.gz -C /path/to/original/directory
- -x 表示解压缩。
- -z 表示使用 gzip 压缩。
- -v 表示显示详细的进度信息。
- -f 表示指定要解压缩的文件名。
- -C 表示指定解压缩后的目标目录。
/path/to/original/directory 是要将备份文件解压缩到的原始目录。请将命令中的这个路径替换为您要解压缩到的目录路径。
执行以上命令后,backup.tar.gz 文件将被解压缩到指定目录中。如果在解压缩过程中出现任何错误,命令将会输出相应的错误信息。
- 将当前目录下所有后缀为.html 的文件的后缀改为.htm
1
rename 's/\.html$/\.htm/' *.html
- rename:Linux系统中的文件重命名命令。
s/\.html$/\.htm/
:这是一个正则表达式,它指示rename命令将.html
后缀替换为.htm
。这里使用$
表示行尾,确保只有.html
后缀被替换。*.html
:通配符*
表示当前目录下所有以.html
结尾的文件。
当你运行这个命令时,所有后缀为.html的文件将被重命名为.htm。请注意,如果您的目录中有多个子目录,则该命令不会重命名这些子目录中的文件。
正则表达式中的s代表替换(substitute)命令的意思,/是正则表达式的分隔符。在分隔符后面的\.html
表示以.html结尾的字符串,\.
表示匹配.字符本身,因为.
在正则表达式中具有特殊含义,表示匹配任意单个字符;$表示匹配字符串的结尾。
正则表达式中的/\.htm/
表示用.htm字符串替换.html字符串。由于/在正则表达式中是分隔符,因此替换命令的最后一个/后面没有字符,表示使用空字符串进行替换。
因此,s/\.html$/\.htm/
的含义是:将以.html结尾的字符串替换为以.htm结尾的字符串。
- 将当前目录下所有子目录下以 a 开头的.cpp 文件改名为以 b 开头的.c 文件
1
find . -type f -name 'a*.cpp' -exec rename 's/^a(.*)\.cpp$/b$1.c/' */a*.cpp
- find . 命令会在当前目录下递归搜索所有子目录。
- -type f 参数会让 find 命令只返回文件类型的结果。(不加也行)
- -name ‘a*.cpp’ 参数会让 find 命令只返回以 a 开头且以 .cpp 结尾的文件名。
-exec 参数会让 find 命令对搜索结果执行后续的命令。
正则表达式:
s/
- 这是sed
命令中进行替换的格式。s 表示替换,接下来是要替换的模式。^a
- 该模式匹配以字母"a"
开头的字符串。^ 表示匹配字符串的开头。(.*)
- 括号内的部分是一个捕获组,它匹配任意数量的字符。.*
表示匹配零个或多个任意字符。\.cpp
- 该模式匹配".cpp"
字符串。由于"."
是正则表达式中的特殊字符,需要使用反斜杠来转义它。$
- 该模式匹配字符串的结尾。/b$1.c/
- 这是替换的格式。$1
表示第一个捕获组中匹配到的内容,即上面括号中的(.*)
部分。这个部分将被替换为 “b” 后面跟着捕获组的内容,再加上 “.c” 后缀。例如,”afile.cpp” 将被重命名为 “bfile.c”。*/a*.cpp
- 这个部分指定要匹配的文件名模式。*/
表示在当前目录下的所有子目录中匹配,a*.cpp
表示匹配所有以 “a” 开头,以 “.cpp” 结尾的文件名。
2 自己查阅 Linux 相关书籍资料,学习并完成以下作业题
- 请简要叙述 DOS/Windows 中的文本文件,UNIX/Linux 中的文本文件以及 Mac
中的文本文件有何不同之处,并给出至少一种你认为较为实用的转换方案。(需
要两两给出转换方案)
在 DOS/Windows 中,文本文件通常使用回车符和换行符(CR-LF)来表示行结束符,即使只有一个字符也会使用两个字符表示行结束。而在 Unix/Linux 中,行结束符只使用换行符(LF)来表示,而在Mac中,行结束符则是回车符(CR)。
这些不同之处可以导致在不同系统之间传输和编辑文本文件时的问题。例如,在将 Windows 上创建的文本文件转移到 Linux 上时,可能会出现文本行末尾出现多余的回车符导致格式不正确的问题。
转换方式:
- Windows->Linux: sed -i “s/\r$//“ file.txt
- Windows->Mac: cat old.txt | tr -d “\n” > new.txt
- Mac->Windows: cat old.txt | tr “\r” “\n” | sed ‘s/$/\r/‘ > new.txt
- Mac->Linux: cat old.txt | tr “\r” “\n” > new.txt
- Linux->Windows: sed -i “s/$/\r/“ file.txt
Linux->Mac: cat old.txt | tr “\n” “\r” > new.txt
请查阅 Linux 系统中/etc/fstab 文件各字段功能,并对你自己安装的 Linux
系统中/etc/fstab 的各个字段做出解释。
在Linux系统中,/etc/fstab是一个文本文件,用于在系统启动时自动挂载文件系统。/etc/fstab文件包含了各个文件系统的挂载点、设备、文件系统类型、挂载选项以及是否需要备份等信息。该文件通常由系统管理员进行编辑。
在Ubuntu系统中,/etc/fstab文件的每一行表示一个记录,每一行又可以分为6个部分,如下所示:
- 要挂载的分区或存储设备,一般是设备名或者设备UUID
- 挂载点,需要自己创建或选择一个目录来讲文件系统挂载到这个目录下,然后就可以从这个目
录中访问要挂载的文件系统。对于交换分区,这部分应填写none,表示没有挂载点。 - 要挂载设备或是分区的文件系统类型,支持许多种不同的文件系统:
ext2,ext3,ext4,reiserfs,xfs,jfs,smbfs,iso9660,vfat,ntfs,swap及 auto。如果设置成auto类型,
mount 命令会猜测使用的文件系统类型。 - 挂载时使用的参数,注意有些mount 参数是特定文件系统才有的。
- auto:开机自动挂载
- noauto:开机不自动挂载
- defaults:按照大多数永久文件系统的缺省值设置挂载定义
- ro:以只读权限挂载
- rw:以可读可写权限挂载
- user:任何用户都可以挂载
- sync:同步磁盘与内存中的数据,而async是异步
- dump 工具通过它决定何时作备份. dump 会检查其内容,并用数字来决定是否对这个文件系统
进行备份。允许的数字是0和1。0表示忽略,1则进行备份。大部分的用户是没有安装dump
的,对他们而言 应设为 0。 fsck 读取 的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。 根目录应
当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2. 0 表示设备不会被 fsck 所检查。用命令行实现: 从光盘制作一个.iso 文件,如果成功将光盘弹出。
1
2
3
4
5
6
7
8
9```
* `cp /dev/cdrom ~/mydisk.iso`:将 `/dev/cdrom` 设备的内容复制到当前用户的 `home` 目录下的 `mydisk.iso` 文件中。这个命令使用 cp 命令,/dev/cdrom 是一个 Linux 中用于访问 CD-ROM 设备的特殊文件,~ 表示当前用户的 home 目录。
* `eject cdrom`:将 `CD-ROM`弹出。eject 命令用于控制光驱的开关,cdrom 是一个设备名或别名,代表当前系统中的 CD-ROM 设备。
### 附加题
```bash
find /tmp/gsl -name "Makefile" -exec printf "cp %s&%s\n" {} {} \;|
sed 's/&\/tmp/ \/home\/usrname/'|xargs -d\n -n1 sh -c
find /tmp/gsl -name "Makefile" -exec printf "cp %s&%s\n" {} {} \;:
在/tmp/gsl
目錄下查找所有名為 Makefile 的文件,將其路徑和路徑複製到一個 cp 命令的格式化字符串中,並將這些字符串連接起來,以 & 字符分隔。這個命令使用了 find 命令和 printf 命令,並使用了{} \;
作為-exec
選項的結束符號。sed 's/&\/tmp/ \/home\/usrname/':
將之前產生的 cp 命令的格式化字符串中的/tmp
路徑替換為/home/usrname
,並將 & 字符替換為一個空格字符。這個命令使用了 sed 命令,並使用了正則表達式進行替換。xargs -d\n -n1 sh -c:
將之前產生的命令字符串作為參數傳遞給 xargs 命令,以 \n 字符分隔參數,並使用 -n1 選項將每個參數作為一個獨立的命令執行。然後使用 sh -c 命令在新的 shell 環境中執行這些命令。
綜合來看,這個命令的作用是在 /tmp/gsl 目錄下查找所有名為 Makefile 的文件,將其複製到 /home/usrname 目錄下。其中使用了 find 命令、printf 命令、sed 命令和 xargs 命令等多個 Linux 命令進行處理。