diff --git "a/09 \345\272\204\347\217\212\347\217\212/20240522 \347\220\206\350\247\243\347\233\256\345\275\225 .md" "b/09 \345\272\204\347\217\212\347\217\212/20240522 \347\220\206\350\247\243\347\233\256\345\275\225 .md" new file mode 100644 index 0000000000000000000000000000000000000000..d6b81a98e3466f22fc2f4916a9e3bca5d77a80df --- /dev/null +++ "b/09 \345\272\204\347\217\212\347\217\212/20240522 \347\220\206\350\247\243\347\233\256\345\275\225 .md" @@ -0,0 +1,98 @@ +假设您刚刚登录到一个Linux系统,并位于您的家目录(`~`)下。您需要完成以下一系列复杂的操作来组织和清理您的文件和目录。请按照顺序执行,并给出相应的命令。 + +1. **创建测试文件**:在家目录下创建三个文本文件,分别命名为`.hidden.txt`(隐藏文件)、`visible1.txt`和`visible2.txt`。 + + ```java + touch .hidden.txt + touch visible1.txt visible2.txt + ``` + + + +2. **列出文件和目录**:列出家目录(`~`)下的所有文件和目录,包括隐藏文件,并查看其详细权限和属性。 + + ```java + ls -al + ``` + + + +3. **创建工作区**:创建一个新的目录`work_area`,并在其中创建三个子目录:`project_a`、`project_b`和`docs`。 + + ```java + mkdir work_area + cd work_area + mkdir project_a project_b docs + ``` + + + +4. **移动文本文件**:将家目录下的所有`.txt`文件移动到`work_area/docs`目录中,并确保这些文件在移动后仍然是隐藏的(如果它们是隐藏的)。 + + ```java + mv ~/*.txt ~/work_area/docs/ + mv ~/.hidden.txt ~/work_area/docs/ + ``` + + + +5. **创建新文件**:在`work_area/project_a`目录下创建一个新的文本文件`notes.txt`,并添加一些内容(例如:`echo "Initial notes for project A" > work_area/project_a/notes.txt`)。 + + ```java + cd work_area/project_a + touch notes.txt + vim notes.txt + ``` + + + +6. **复制目录**:递归地复制`work_area/project_a`目录到`work_area/project_b`,并命名为`project_a_backup`。 + + ```java + cp -r project_a project_b + mv project_a project_a_backup + ``` + + + +7. **列出文件并按大小排序**:列出`work_area/docs`目录下的所有文件,并按文件大小降序排列。 + + ```java + ls -arls + ``` + + + +8. **删除所有文件**:删除`work_area/docs`目录下所有文件。 + + ```java + rm -f .hidden.txt visible1.txt visible2.txt + ``` + + + +9. **删除目录**:假设您不再需要`work_area/project_b`目录及其所有内容,请递归地强制删除它。 + + ```java + rm -rf project_b + cd .. + ``` + + + +10. **清理空目录**:清理`work_area`目录,删除其中所有的空目录(注意:不要删除非空的目录)。 + + ```java + rm -d docs + ``` + + + +11. **创建别名**:回到您的家目录,并创建一个别名`llh`,该别名能够列出当前目录下文件和目录的长格式列表,并以人类可读的格式显示文件大小(类似于`ls -lh`命令)。 + + ```java + alias llh='ls -lh' + llh + ``` + + \ No newline at end of file diff --git "a/09 \345\272\204\347\217\212\347\217\212/20240524 \347\206\237\346\202\211cp\345\222\214mv.md" "b/09 \345\272\204\347\217\212\347\217\212/20240524 \347\206\237\346\202\211cp\345\222\214mv.md" new file mode 100644 index 0000000000000000000000000000000000000000..1bccba98a57b5f98de62627f7fa2d6b71f6b90d4 --- /dev/null +++ "b/09 \345\272\204\347\217\212\347\217\212/20240524 \347\206\237\346\202\211cp\345\222\214mv.md" @@ -0,0 +1,389 @@ +# 笔记 + +## cp + +``` +**cp**:copy 复制文件或目录。 + +复制的时候,如果目标已存在,会被覆盖 + +* 复制文件:`cp 源文件 目标文件` +* 复制文件到目录: cp 源文件 目标目录 +* 复制目录:`cp -r 源目录 目标目录` :没-r复制不了目录 +* 当cp有三个参数以上时: + * 最后一个是目标目录 + * 而且必须是目录,不是文件 + +`cp` 是 Linux 和 Unix 系统中用于复制文件或目录的命令。以下是 `cp` 命令的一些常见用法: + # 1.复制单个文件: + cp 文件1 目录1/文件1 # 将文件1复制一份到目录1,目标文件如果已经存在就会被覆盖掉 + cp 文件1 文件2 # 将文件1复制一份为文件2 + cp 文件1 目录1/文件2 # 将文件1复制一份到目录1,并改名为文件2 + + + # 例如,将 `old.txt` 复制为 `new.txt`: + cp old.txt new.txt # 最终得到old.txt 和 new.txt + + + # 2.复制文件到目录: + cp 要复制的文件名 要复制到的文件夹路径 + # 例如,将 `成绩单.txt` 复制到 `/usr/local/各班成绩汇总` 目录: + cp 成绩单.txt /usr/local/各班成绩汇总/ # 最终在/usr/local/各班成绩汇总/也会出现成绩单.txt文件 + + + #3. 递归复制目录: + # 复制目录时使用 `-r` 或 `-R` 选项可以递归地复制目录及其内容。 + cp -r 源目录 目标目录 + # 例如,将 `22级1班成绩` 目录及其内容复制到 `22级成绩汇总`目录下: + cp -r 22级1班成绩 22级成绩汇总/ + + + #4. 交互式复制:# 会确认覆盖信息 + #使用 `-i` 选项,在覆盖已存在的文件前会提示用户确认。 + cp -i 源文件 目标文件 # 复制源文件为目标文件,如果目标文件已经存在,会底部是否覆盖 + # 例如:将c1.txt复制成c2.txt时,发现c2.txt已存在 + $ cp -i c1.txt c2.txt + cp: 是否覆盖 'c2.txt'? # 要覆盖就输入y,如果是n是取消复制 + + + #5. 保留文件属性:原封不动的复制 + # 使用 `-p` 选项可以保留原文件的属性(如时间戳、权限等)。 + cp -p 源文件 目标文件 + # 例如:将c1.txt复制成c3.txt,并保留c1.txt的文件属性 + $ cp -p c1.txt c3.txt + + #6. 显示复制进度: + # 使用 `-v` 选项可以显示详细的复制进度信息。类似的有tar rm + cp -rv 源目录 目标目录 # 会在递归复制的时候显示进度信息 +``` + #7. 仅当源文件较新时复制**: update + # 使用 `-u` 选项可以仅当源文件比目标文件新时才进行复制。update + cp 1班成绩.txt 1班成绩.txt.bak # 直接覆盖 + cp -u 1班成绩.txt 1班成绩.txt.bak # 更新才复制 + + + #8. 强制复制:rm -f + # 使用 `-f` 或 `--force` 选项可以强制复制,即使目标文件已存在也不提示,直接覆盖。 + cp -f old_file new_file + + #9. 批量复制文件: + # 可以使用通配符(如 `*`)来批量复制文件。 + cp *.txt 笔记/ + # 这将复制当前目录下所有 `.txt` 结尾的文件到 `笔记` 目录。 + + #10 同时复制多个文件或目录到 某个目录 + cp 1.txt 2.txt 3.txt 笔记 # 一次性同时将1、2、3.txt都复制到笔记目录 + cp -r dir1 dir2 dir3 # 同时将dir1,dir2复制到dir3内,因为是复制目录,要加-R + cp -R 1.txt dir1 dir2 # 同时将文件和目录一起复制到dir2 + + #11 复制时产生备份文件,尾标~ + cp -b a.txt tmp/ # 如果/tmp目录已经有a.txt 就会将原来的a.txt备份成a.txt~ backup + + #12 指定备份文件尾标 + cp -b -S _bak a.txt /tmp # 如果/tmp目录已经有a.txt 就会将原来的a.txt备份成a.txt_bak + #使用 cp -b -S _bak a.txt /tmp 命令,当目标目录 /tmp 中已经存在 a.txt 文件时,会先将其重命名为 a.txt_bak 作为备份,然后再将新的 a.txt 文件复制到目标目录。这可以有效地防止文件被覆盖,确保数据的安全性 +**mv**:move 移动文件或目录,也可用于重命名文件或目录。 + +* 移动文件或目录:`mv 源目录/文件 目标目录` ,相当于剪切 + +* 重命名文件或目录:`mv 原文件名 新文件名`在 Linux 中,`mv` 命令用于移动文件或目录,或者对它们进行重命名。以下是 `mv` 命令的一些常见用法: + +原则: 目标不存在,一定重命名 + +1. 当是移动时,只能是文件移到目录 + +2. 如何分辩是移动还是重命名 + + 1. 源文件 - 目标文件 :mv a.txt b.txt + + 1. 目标已经存在:源文件替换了目标文件 + 2. 目标不存在:直接将源文件改名为目标文件 + + 2. 源文件 -目标目录、:mv a.txt dir1 + + 1. 目标存在:将源文件移到目标目录里 + 2. 目标不存在:将源文件改为目标名 + + 3. 源目录 - 目标目录 + + 1. 目标已存在:将源移到目标里 + 2. 已经不存在:源目录改为目标目录名 + + 4. 8种场景 + + 1. 文件到文件: + + 2. 目标存在:目标会源文件替换掉。原文件不见了 + + 3. 目标不存在:直接重命名了 + + 4. 文件到目录 + + 5. 目标目录存在: + + 1. 目标目录又存在源文件的同名文件:直接覆盖 + 2. 目标目录不存在同名文件,直接移动 + + 6. 目标目录不存在:重命名 + + 7. 目录到目录 + + 8. 目标存在:移动到目标目录 + + 9. 目标不存在:重命名 + + 10. 目录到文件 + + 11. 目标存在:报错 + + 12. 目标不存在:重命名 + + 5. **移动文件或目录**: + + 将文件从移动到指定目录: + + mv 文件 目标目录 + + 将源目录A移动到目标目录B + + mv 目录A 目录B + + #注意:如果目标目录不存在,`mv` 命令会将其视为要重命名的文件名 + +2. **重命名文件或目录**: + + 重命名文件: + + mv 旧文件名 新文件名 + + 重命名目录 + + mv 旧目录名 新目录名 + #注意,如果新文件名已存在,就会被覆盖,如果新目录名已经存在,就变成了移动 + +3. **移动并重命名:** + + 移动一个文件到新目录,并重命名这个文件。 + + mv 1.txt /tmp/2.txt # 移动当前目录下的1.txt到/tmp目录,并重命名为2.txt + + 移动了一个目录到另一个目录下,并重命名 + + mv aDir /tmp/bDir # 将当前目录下的aDir目录移动到/tmp目录下,将改名为bDir + + 移动多个文件 参数大于等于3个时: + + - mv # 跟了3个参数以上时,最后一个默认是目录 + + 同时移动多个文件到指定目标 + + mv 1.txt 2.txt /tmp # 将1.txt和2.txt 移动到/tmp目录下 + + 同时移动多个目录到指定目录下 + + mv aaa bbb /tmp # 将aaa和bbb 移动到/tmp目录下 + + 使用通配符(如 `*`)来匹配多个文件或目录,并将它们移动到目标目录。 + + mv *.txt /tmp # 移动当前目录下所有.txt结尾的文件和目录到/tmp目录下 + mv a* /tmp # 移动当前目录下,所有a开头的文件和目录到 /tmp目录下 + mv * /tmp # 移动当前目录下的,所有文件和目录到/tmp目录下 + +4. **交互式操作**: + + 使用 `-i` 选项,`mv` 命令会在移动或重命名文件前进行确认,以避免意外覆盖文件。 + + mv -i 1.txt 2.txt # 当2.txt文件已经存在时,系统会提示你是否要覆盖。y 确认,n 取消 + +5. **显示详细信息**: + + 使用 `-v` 选项,`mv` 命令会显示详细的操作信息,包括移动或重命名的文件名。 + + mv -v 1.txt 2.txt # 重命名1.txt为2.txt并显示详情 + renamed '1.txt' -> '2.txt' # 显示详细 + +7. **覆盖文件前先备份**: +* 使用 `-b` 选项,`mv` 命令会在覆盖文件之前对其进行备份。 + mv -b 1.txt 2.txt # 如果2.txt已存在,就先备份2.txt为2.txt~,再次1.txt改成为2.txt + +## 9. **touch**:`touch` 命令主要用于创建新文件和更新文件时间戳。 +# 作业 + +**1. 初始文件结构创建** + +在您的家目录(`~`)下创建一个名为`my_projects`的目录,并在该目录下创建`proj_a`、`proj_b`两个子目录,同时在`proj_a`中创建`file1.txt`和`file2.jpg`两个文件。 + + mkdir my_projects + +**2. 复制同路径文件** + +将`my_projects/proj_a/file1.txt`复制到`my_projects/proj_a/file1_copy.txt`。 + + mv proj_a/file1.txt proj_b/file1_copy.txt + +**3. 复制不同路径文件** + +将`my_projects/proj_a/file1.txt`复制到`my_projects/proj_b/`,并重命名为`copied_file1.txt`。 + + cp my_projects/proj_a_copy/file1.txt my_projects/proj_b/copied_file1.txt + +**4. 复制同路径目录** + +复制`my_projects/proj_a`到`my_projects/proj_a_copy`。 + + mv my_projects/proj_a my_projects/proj_a_copy + +**5. 复制不同路径目录** + +将`my_projects/proj_a`目录复制到您的家目录(`~`),并重命名为`home_proj_a`。 + + cp -r my_projects/proj_a_copy home_proj_a + +**6. 复制文件和目录到不同路径** + +将`my_projects/proj_a/file2.jpg`和`my_projects/proj_b`目录一起复制到`~/archive`目录下。 + + cp my_projects/proj_a_copy/file2.txt ~/archive/ && cp -r my_projects/proj_b ~/archive/ + +**7. 批量复制** + +将`my_projects`目录下的所有`.txt`文件复制到`~/text_files`目录下。 + + find my_projects -type f -name "*.txt" -exec cp {} ~/text_files/ \; + + + +**8. 交互式复制文件** + +新建一个`test.jpg`文件,然后将其从`my_projects`目录复制到`~/images`目录下。如果该文件已存在,则提示用户覆盖。 + + cp -i my_projects/test.jpg ~/images/ + cp: overwrite '/home/abc/images/test.jpg'? y + +**9. 显示复制进度** + +使用`rsync`命令将`my_projects/proj_a`目录及其内容复制到`~/sync_folder`,并显示复制进度。 + + + mkdir ~/sync_folder + + rsync -av --progress my_projects/proj_a_copy/ ~/sync_folder/ + sending incremental file list + ./ + file1.txt + 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=1/3) + file2.txt + 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=0/3) + + sent 181 bytes received 57 bytes 476.00 bytes/sec + total size is 0 speedup is 0.00 + + + +**10. 条件复制** + +只有当`my_projects/proj_a/file1.txt`比`~/old_files/file1.txt`新或不存在时,才复制该文件。 + +``` +cp -u ~/my_projects/proj_a/file1.txt ~/old_file +``` + + + + + +**11. 复制时备份** + +在复制`my_projects/proj_a/file1.txt`到`~/backup`目录之前,如果`~/backup/file1.txt`已存在,则先创建一个带有`.bak`后缀的备份文件。 + +``` + cp -b my_projects/proj_a_copy/file1.txt /tmp/backup + tree + . + ├── archive + │ ├── file2.txt + │ └── proj_b + │ ├── copied_file1.txt + │ └── file1_copy.txt + ├── backup + │ ├── file1.txt + │ ├── file1.txt~ + │ └── file1.txt_bak + ├── home_proj_a + │ ├── file1.txt + │ └── file2.txt + ├── images + │ └── test.jpg + ├── my_projects + │ ├── proj_a_copy + │ │ ├── file1.txt + │ │ └── file2.txt + │ ├── proj_b + │ │ ├── copied_file1.txt + │ │ └── file1_copy.txt + │ └── test.jpg + ├── sync_folder + │ ├── file1.txt + │ └── file2.txt + └── text_files + ├── copied_file1.txt + ├── file1_copy.txt + ├── file1.txt + └── file2.txt + +cp -b --suffix=.bak my_projects/proj_a/file1.txt backup +``` + + + +**12. 重命名文件或目录** + +将`my_projects/proj_a/file1.txt`重命名为`my_projects/proj_a/new_file1.txt`,如果`new_file1.txt`已存在,则提示用户确认是否覆盖。 + +``` + mv my_projects/proj_a_copy/file1.txt my_projects/proj_a_copy/new_file1.txt + tree + . + ├── archive + │ ├── file2.txt + │ └── proj_b + │ ├── copied_file1.txt + │ └── file1_copy.txt + ├── backup + │ ├── file1.txt + │ ├── file1.txt~ + │ └── file1.txt_bak + ├── file1.txt + ├── home_proj_a + │ ├── file1.txt + │ └── file2.txt + ├── images + │ └── test.jpg + ├── my_projects + │ ├── proj_a_copy + │ │ ├── file2.txt + │ │ └── new_file1.txt + │ ├── proj_b + │ │ ├── copied_file1.txt + │ │ └── file1_copy.txt + │ └── test.jpg + ├── new_file1.txt + ├── sync_folder + │ ├── file1.txt + │ └── file2.txt + └── text_files + ├── copied_file1.txt + ├── file1_copy.txt + ├── file1.txt + └── file2.txt +``` + + + +**13. 移动并重命名文件或目录** + +将`my_projects/proj_b`目录移动到`~/moved_projects`并重命名为`moved_proj_b`,如果`moved_proj_b`已存在,则先备份该目录再进行移动和重命名。 + +``` +mv -b my_projects/proj_b moved_projects/moved_proj_b +``` \ No newline at end of file