我如何编写简单的CLI脚本来实现生活的自动化。

213 阅读6分钟

Image description

我每天都要拍几百张屏幕截图,但我总是忘记删除它们。它们最终占用了我机器上的大量内存,有时我不能只是批量突出显示和删除,因为我担心会删除我真正需要的重要图片和视频。

开始之前

我想先说一下,这个教程在很大程度上取决于我对Warp AI的使用,它基本上是一个内置于终端的ChatGPT集成,可以快速生成任何问题的答案/代码片断。

在下一节,我将把提示(我问Warp AI的内容)和Warp AI的输出是什么。我基本上只是按照这些指示在5分钟内写完了我的脚本。

我的过程总结

所以我写这个脚本的过程就是:

  • 询问Warp AI如何做某事。
  • 复制它给我的输出(代码块+运行的命令)。
  • 检查它是否有效。
  • 向Warp AI询问任何错误/让它调整其输出。

在下面的部分,我将包括我与Warp AI互动的全部记录,因为我正在构建我的脚本。这大概花了我不到5分钟的时间。如果你不想阅读整个记录,这里有一个总结。


  1. 问Warp AI如何写一个脚本,删除我的Documents目录中的所有屏幕截图。

  2. 复制输出,但意识到它寻找的所有东西都被命名为 "screenshots.png",而我的屏幕截图被命名为 "Screen Shot XYZ.png"

  3. 要求Warp AI调整其输出,以寻找 "屏幕截图 "这一短语,并且不区分大小写。

  4. 获得基本功能,然后通过让脚本打印出它所删除的文件的名称来改进它。

  5. 要求Warp AI解释一些输出,这样我就可以理解我的脚本在做什么,并在这个过程中学习。


Warp AI的文字记录 (OK To Skip to Conclusion)

提示:给我写一个脚本,删除我的文档目录中的所有屏幕截图。

Warp AI: 当然!这是一个可以删除你文档目录中所有截图的脚本:

#!/bin/bash

cd ~/Documents
rm -f *screenshot*.png

进入全屏模式 退出全屏模式

把这个脚本保存为一个扩展名为.sh 的文件(例如:delete_screenshots.sh ),然后用下面的命令使其可以执行:

chmod +x delete_screenshots.sh

进入全屏模式 退出全屏模式

然后,你可以用下面的命令在终端运行这个脚本:

./delete_screenshots.sh

进入全屏模式 退出全屏模式

这将改变你的文档目录,并删除所有文件名中带有 "screenshot "和".png "扩展名的文件。运行这个脚本时要小心,因为它将永久地删除这些文件而不提示确认。

提示:我是否必须在每次编辑.sh文件时运行chmod +x命令?

经纬网AI:不,你不必每次编辑.sh 文件时都运行chmod +x 命令。chmod +x 命令只需要运行一次就可以使脚本执行。

但是,如果你对脚本进行了修改并保存了文件,你就需要再次运行该脚本以看到修改后的效果。如果你已经用chmod +x 使脚本可执行,你可以简单地用./script_name.sh 再次运行该脚本,以执行该脚本的更新版本。

如果你对脚本进行了修改,并且想看看修改后的效果,而不需要再次运行chmod +x 命令,你可以使用下面的命令在当前的shell会话中重新加载脚本:

source script_name.sh

进入全屏模式 退出全屏模式

这将重新加载脚本,并应用你对它所做的任何修改,而不要求你再次使脚本可执行。

提示:你能不能编辑上面的脚本,删除任何文件名包括 "Screen Shot "并且不区分大小写的文件?

Warp AI: 可以,这里有一个更新的脚本,可以删除你的文档目录中所有文件名中含有 "Screen Shot "的文件(不区分大小写):

#!/bin/bash

cd ~/Documents
shopt -s nocaseglob
rm -f *Screen\\ Shot*

进入全屏模式 退出全屏模式

shopt -s nocaseglob 命令启用了不区分大小写的globbing,这意味着*Screen\\ Shot* 模式将匹配文件名中带有 "Screen Shot "的任何大小写字母组合。

把这个脚本保存为以.sh 为扩展名的文件(如delete_screen_shots.sh ),然后用下面的命令使其可执行:

chmod +x delete_screen_shots.sh

进入全屏模式 退出全屏模式

然后,你可以用下面的命令在终端运行这个脚本:

./delete_screen_shots.sh

进入全屏模式 退出全屏模式

这将改变到你的文档目录,并删除所有文件名中带有 "Screen Shot "的文件(不区分大小写)。运行这个脚本时要小心,因为它将永久性地删除这些文件而不提示确认。

提示:你能不能编辑上面这个脚本,以输出它所删除的所有屏幕截图的名称,每个都在它们自己的行上?

Warp AI: 可以,这里有一个更新的脚本,它将删除你的文档目录中所有文件名中带有 "Screen Shot "的文件(不区分大小写),并输出被删除文件的名称:

#!/bin/bash

cd ~/Documents
shopt -s nocaseglob
deleted_files=(*Screen\\ Shot*)
rm -f "${deleted_files[@]}"
printf "Deleted files:\\n%s\\n" "${deleted_files[@]}"

进入全屏模式 退出全屏模式

deleted_files=(*Screen\\ Shot*) 行创建了一个所有文件名中带有 "Screen Shot "的数组(不区分大小写),rm -f "${deleted_files[@]}" 行删除了所有这些文件。最后,printf 命令输出被删除文件的名称。

把这个脚本保存为以.sh 为扩展名的文件(例如:delete_screen_shots.sh ),然后用以下命令使其可执行:

chmod +x delete_screen_shots.sh

进入全屏模式 退出全屏模式

然后,你可以用下面的命令在终端运行这个脚本:

./delete_screen_shots.sh

进入全屏模式 退出全屏模式

这将切换到你的文档目录,删除所有文件名中带有 "Screen Shot "的文件(不区分大小写),并输出被删除文件的名称。运行这个脚本时要小心,因为它将永久性地删除这些文件而不提示确认。

提示:What does the \n%s\n do?

经纬网AI:printf 命令中的\\n 字符是转义序列,代表换行符,它使输出的格式化,每个被删除的文件名都在单独一行。

printf 命令中的%s 格式指定符是一个字符串值的占位符,它被deleted_files 数组的值所取代。在数组名称后面的@ 符号告诉printf ,将数组扩展为单独的参数,数组中的每个元素都被视为单独的字符串值。

因此,带有%s 指定符和@ 符号的printf 命令将deleted_files 数组扩展为独立的字符串参数,然后将这些参数打印在不同的行上,每个字符串前后都有一个换行符。

结论

Image description

最后,我现在有了一个可以工作的脚本,我可以很容易地从命令行中运行。

太疯狂了,我可以在不了解CLI脚本的情况下轻松地编写bash脚本。