4  Shell

4.1 文件操作

4.1.1 复制文件


# 将修改日期在20240421以后的mp4,jpg及jpeg文件复制至目标文件后,再删除


robocopy "C:\Users\Lenovo\Downloads" "C:\Your\Target\Folder" *.mp4 *.jpg *.jpeg /mov /minage:20240421

del "C:\Users\Lenovo\Downloads\*.mp4"
del "C:\Users\Lenovo\Downloads\*.jpg"
del "C:\Users\Lenovo\Downloads\*.jpeg"
cp -vr /home/hulihuihong/HuLinhui/posts/ECMO-paper-submission data/ecmo

-v 选项在复制过程中显示详细信息

注意,如果目标文件夹已存在,源文件夹的内容将会被复制到目标文件夹中,并覆盖任何同名文件或文件夹。

4.1.2 替换字符

sed -i 's/old_text/new_text/g' *.php   # 将当前文件夹下所有php文件内的old_text替换为new_text

4.1.3 查找文件

  • 根据文件名查询位置
find / -name "step-001-set_path.sql"   # 从根目录开始查找

find . -name "step-001-set_path.sql"  # 从当前目录开始查找
  • 根据关键词查询文件名称及位置
grep -r "articlewarehouse" /path/to/search/directory   # 列出文本所在行的内容

grep -r -l "articlewarehouse" ./*.py  # 从当前目录开始搜索

解释说明: - grep是用于在文件中搜索指定模式的命令。 - -r选项表示递归搜索,将搜索当前目录下的所有子目录。 - -l选项表示仅显示匹配的文件名。 - "articlewarehouse"是要搜索的特定字符或模式。 - ./表示当前目录。 - *.py表示要搜索的文件类型为.py文件。

将从当前目录开始递归搜索包含”articlewarehouse”字符的.py文件,并显示匹配的文件名。

4.1.4 解压文件

unzip -O CP936 4.1试验方案(2.0,20221205)等4个文件.zip

-O CP936表示使用 GBK 编码进行解压,可以解决解压后的中文文件名出现乱码的问题。O就是字母,不是数字。适用于zip, tar.gz等文件。

unrar x 文件名.rar

4.2 删除文件

# 删除所有html文件

rm *.html

4.2.1 新建文件并写入文本

echo "# demo {.unnumbered}" > demo.qmd

4.2.2 将文本文件内容写入qmd文件

cat demo.txt > demo.qmd

4.2.3 新建空文件

touch demo.qmd

4.2.4 纯文本编辑器打开文件

nano demo.qmd

在nano文本编辑器中常用的一些快捷键:

  • Ctrl + G:显示帮助文档(可以查看所有可用的快捷键)
  • Ctrl + O:保存文件
  • Ctrl + X:退出nano编辑器
  • Ctrl + K:剪切一行或选定的文本
  • Ctrl + U:粘贴剪切的文本
  • Ctrl + W:查找文本
  • Ctrl + \:替换文本
  • Ctrl + Space:向前滚动一行
  • Ctrl + V:向后滚动一行
  • Ctrl + Y:向上滚动一页
  • Ctrl + V:向下滚动一页
  • Ctrl + C:显示当前光标所在行的行号和列号
  • Ctrl + J:插入新行
  • Ctrl + D:删除光标所在位置的字符
  • Ctrl + T:切换自动缩进模式

4.2.5 改变文件(夹)权限

chmod 755 文件名
chmod -R 777 文件夹名称

在Linux和Unix系统中,文件的权限由三个组合在一起的三位数字表示,每个数字代表一个权限组。以下是权限代码及其含义:

  • 0: 没有权限(—)
  • 1: 执行权限(–x)
  • 2: 写权限(-w-)
  • 3: 写和执行权限(-wx)
  • 4: 读权限(r–)
  • 5: 读和执行权限(r-x)
  • 6: 读和写权限(rw-)
  • 7: 读、写和执行权限(rwx)

这三个数字分别表示了文件所有者、用户组和其他用户的权限。下面是一些常见的权限代码及其含义:

  • 777: 所有者具有读、写和执行权限,用户组和其他用户具有读、写和执行权限。
  • 755: 所有者具有读、写和执行权限,用户组和其他用户具有读和执行权限。这是一种常见的设置,适用于可执行文件。
  • 644: 所有者具有读和写权限,用户组和其他用户具有只读权限。这是一种常见的设置,适用于普通文本文件。
  • 700: 只有所有者具有读、写和执行权限,用户组和其他用户没有任何权限。适用于敏感文件,只允许所有者访问。
  • 666: 所有者、用户组和其他用户都具有读和写权限,但没有执行权限。适用于普通文本文件。
  • 600: 只有所有者具有读和写权限,用户组和其他用户没有任何权限。适用于敏感文件,只允许所有者访问。

4.3 文件夹操作

4.3.1 删除文件夹

# 删除所有以_file结尾的文件班主任
rm -r *_files

4.3.2 软链接文件夹

通过访问文件夹A,可以访问到文件夹B的内容,相当于快捷方式

# 将notebook文件夹的data文件夹的所有文件(不包括文件夹)软连接至与notebook同一目录的data文件夹

ln -sf notebook/data/* data


# 等效于以下命令

find notebook/data -type f -exec ln -sf {} data \;

如果要同时包括子文件夹,则用以下命令:

data文件夹会自动创建,不用事先创建代码后面的那个data文件夹

find notebook/data -type f -o -type d -exec ln -sf {} data \;

4.3.3 查找文件夹

find /home/hulihuihong/Books/*/_book -maxdepth 0 -type d

你提供的命令将在当前目录中搜索与模式”/home/hulihuihong/Books/*/_book”匹配的目录。以下是命令的解释:

  • find:用于搜索文件和目录的命令。
  • /home/hulihuihong/Books/*/_book:要查找的目录的路径模式。*是通配符,表示匹配任何字符序列。
  • -maxdepth 0:将搜索限制为当前目录级别。这意味着只有在指定路径直接下的目录会被考虑。
  • -type d:指定只考虑目录。

运行此命令将列出在当前目录中与模式”/home/hulihuihong/Books/*/_book”匹配的所有目录。

4.3.4 查看当前文件夹

dir
  • 返回上一层文件夹
cd ../
  • 删除文件
rm filename.ext
  • 删除文件夹
rm -r foldername
  • 复制文件夹
cp -r source_folder destination_folder
  • 批处理文件

render.sh文件内容如下:

cp -r /www/wwwroot/www.mmphcrc.com/pdf/jupyter/HuLinhuiPy/PPT /home/hulihuihong/HuLinhui/posts/
quarto render /home/hulihuihong/HuLinhui/posts/PPT/肾脏替代治疗决策流程.ipynb
  • 添加可执行权限
chmod +x render.sh

4.3.5 压缩文件夹

tar -cvf archive.tar folder

<!-- 或者 -->

zip archive.zip folder

<!-- 如果folder里有子文件夹,加上`-r`flag -->
zip -r data.zip data
zip -r archive.zip folder
zip -r archive.zip folder

如果压缩过程中不保留路径(即只保留文件名而不包含目录结构),可以在命令中添加参数。例如:

zip -r --junk-paths archive.zip folder
tar -czvf --strip-components=1 archive.tar.gz folder

4.4 ffmpeg

4.4.1 压缩视频

使用ffmpeg进行视频压缩,并尽量保持视频的清晰度,您可以尝试以下命令:

ffmpeg -i '.\Video demonstration of three-stitch technique.MP4' -c:v libx264 -crf 20 -preset slow -c:a copy output.mp4

这个命令使用libx264编码器将输入视频文件(input.mp4)压缩为输出视频文件(output.mp4)。其中,-crf 参数控制视频质量,值越低表示质量越高,范围一般在18-28之间;-preset 参数设置编码速度和压缩效率,slow 对应较慢但更高质量的压缩。

4.4.2 按起始时间点提取视频

<!-- 第1段: -->
ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:00:00 -to 00:00:45 segment1.mp4

<!-- 第2段: -->
ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:00:46 -to 00:02:32 segment2.mp4

<!-- 调整比特率压缩至25M以下: -->
ffmpeg -i segment2.mp4 -b:v 1500k segment2_compress.mp4  

<!-- 第3段: -->
ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:02:34 -to 00:04:07 segment3.mp4

<!-- 4211 bytes/s的情况下,size = 48.2,故重新用2000 bytes/s压缩一次,得到24.8MB -->

ffmpeg -i segment3.mp4 -b:v 2000k segment3_compress.mp4 


<!-- 第4段: -->

ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:04:08 -to 00:04:55 segment4.mp4


<!-- 第5段: -->

ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:04:56 -to 00:07:17 segment5.mp4

ffmpeg -i segment5.mp4 -b:v 1350k segment5_compress.mp4 


<!-- 第6段: -->

ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:07:18  -to 00:09:40 segment6.mp4

ffmpeg -i segment6.mp4 -b:v 1200k segment6_compress.mp4

<!-- 第7段: -->

ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:09:41  -to 00:12:45 segment7.mp4

ffmpeg -i segment7.mp4 -b:v 1200k segment7_compress.mp4


<!-- 第8段: -->

ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:12:57  -to 00:13:30 segment8.mp4


<!-- 第9段: -->

ffmpeg -i Video-demonstration-of-three-stitch-technique-1080p-compress.mp4 -ss 00:13:31  -to 00:14:55 segment9.mp4

ffmpeg -i segment9.mp4 -b:v 2000k segment9_compress.mp4

4.4.3 按时长分割

  • 小于45M则移到目标文件夹,大于45M则分割成2分钟的片段

split.bat文件内容如下:

@echo off
setlocal enabledelayedexpansion

REM 设置源文件夹和目标文件夹路径
set "source_folder=E:/tw"
set "destination_folder=E:/tw_split"
set "ffmpeg_path=E:\ffmpeg-master-latest-win64-gpl\bin\ffmpeg.exe"

REM 遍历源文件夹中的所有文件
for %%I in ("%source_folder%\*") do (
    REM 获取文件大小(以字节为单位)
    set "file_size=%%~zI"
    
    REM 将文件大小转换为兆字节(MB)
    set /A "file_size_mb=file_size / 1024 / 1024"

    REM 如果文件大小小于等于45MB,则直接复制
    if !file_size_mb! LEQ 45 (
        move "%%I" "%destination_folder%"
        echo Copied "%%I" to "%destination_folder%"
    ) else (
        REM 如果文件大小大于45MB,则进行分割
        set "filename=%%~nxI"
        set "filename_no_extension=!filename:~0,-4!"
        set "extension=!filename:~-3!"

        REM 使用ffmpeg进行分割
        "%ffmpeg_path%" -i "%%I" -c copy -map 0 -segment_time 00:02:00 -f segment "%destination_folder%\!filename_no_extension!-%%03d.!extension!"
        echo Split "%%I" into segments in "%destination_folder%"
    )
)

endlocal

pause

4.5 Github cli

4.5.1 安装

参考: https://github.com/cli/cli?tab=readme-ov-file#installation

type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y)
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
&& sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
&& sudo apt update \
&& sudo apt install gh -y

4.5.2 更新

sudo apt update
sudo apt install gh