基本 Bash 自动化:用于组织我的下载文件夹的脚本

2025-06-10

基本 Bash 自动化:用于组织我的下载文件夹的脚本

最近,我在我的 PC 上安装了 Ubuntu 和 Windows 双启动系统,在使用 Ubuntu 的最初几天,我下载了大量文件进行设置,而且由于学校正在如火如荼地开学,这意味着我需要下载大量的 PDF、Word 文档和 PowerPoint 演示文稿。

现在我的下载文件夹很乱,所以自然而然地,我没有花 5 分钟来整理它,而是花了 30 分钟编写一个 bash 脚本来帮我整理它。德雷克 MEME

那么我们来谈谈 bash。

什么是 Bash?

这是 Bourne-Again SHell 的首字母缩写词。

根据定义,它是 GNU 操作系统的命令语言。每当你在 Ubuntu 上打开终端时,诸如 mv、cp 等命令都是 bash 终端命令。

让我们写一些 Bash

创建一个名为organize.sh

与大多数脚本一样,我们首先需要指定要编写的脚本是 bash。为此,我们使用 shebang 。#!/bin/bash
这表示该文件的内容将是一个 bash 脚本。

之后,我们需要指定在整理过程中将所有数据移动到何处。具体来说,我有图像、音频、视频、PDF、PowerPoint、其他 Bash 脚本、zip 文件和其他文件。因此,为了简单起见,我们只创建 6 个文件夹:图像、音频、视频、PDF、脚本和压缩文件。我们可以使用mkdir以下命令创建所有这些文件夹:



mkdir Image_Files Audio_Files Video_Files PDFs Scripts Compressed_Files


Enter fullscreen mode Exit fullscreen mode

现在我们有了这些,剩下的就是把文件移动到这些文件夹中。这里我们需要更聪明一些。对于像图像文件这样的文件,我们会使用不同的文件扩展名(例如.png .jpg .gif .tif和其他)来识别它们。所以我们需要脚本查找具有该特定扩展名的任何文件,并将其移动到名为 Image_Files 的文件夹中。这样的命令如下所示:



mv *.png *.jpg *.jpeg *.tif *.tiff *.bpm *.gif *.eps *.raw Image_Files


Enter fullscreen mode Exit fullscreen mode

星号 (*) 将匹配扩展名前面的任何字符。它是正则表达式语法的一部分,但这超出了本文的讨论范围。

类似地,我们匹配其他文件类型的文件扩展名。最终结果如下:



#Image Files
mv *.png *.jpg *.jpeg *.tif *.tiff *.bpm *.gif *.eps *.raw Image_Files

# Audio Files 
 mv *.mp3 *.m4a *.flac *.aac *.ogg *.wav Audio_Files

 # Video Files 
 mv *.mp4 *.mov *.avi *.mpg *.mpeg *.webm *.mpv *.mp2 *.wmv Video_Files

# PDFs 
mv *.pdf PDFs

# Scripts
mv *.py *.rb *.sh Scripts

#Compressed Files
mv *.rar *.zip Compressed_Files


Enter fullscreen mode Exit fullscreen mode

在“脚本”下,我添加了 Python(.py) 和 Ruby(.rb) 文件,因为它们也可以用来编写一些系统脚本。我们还可以添加一些 echo 命令,以便在脚本运行时显示其位置。这不需要太复杂,只需在末尾添加一行即可,如下所示;



echo "All done organizing your messy messy downloads Folder"


Enter fullscreen mode Exit fullscreen mode

保存文件后,你还需要做一件事。该文件目前还没有执行权限,但这不难解决。在 Linux 终端上,输入:



chmod u+x organize.sh


Enter fullscreen mode Exit fullscreen mode

其中 organise.sh 是文件名。
现在你可以将该文件移动到下载文件夹并运行./organize.sh

成功了吗?可能有点太顺利了。organize.sh 文件自己整理到了脚本文件夹中。为了解决这个问题,我决定在脚本末尾添加以下三行代码。



cd Scripts 
mv organize.sh ..
cd ..


Enter fullscreen mode Exit fullscreen mode

所以最终的文件应该是这样的;



#!/bin/bash

#Create Folders
mkdir Image_Files Audio_Files Video_Files PDFs Scripts Compressed_Files

#Image Files
mv *.png *.jpg *.jpeg *.tif *.tiff *.bpm *.gif *.eps *.raw Image_Files

# Audio Files 
 mv *.mp3 *.m4a *.flac *.aac *.ogg *.wav Audio_Files

 # Video Files 
 mv *.mp4 *.mov *.avi *.mpg *.mpeg *.webm *.mpv *.mp2 *.wmv Video_Files

# PDFs 
mv *.pdf PDFs

# Scripts
mv *.py *.rb *.sh Scripts

#Compressed Files
mv *.rar *.zip Compressed_Files

cd Scripts 
mv organize.sh .. 
cd ..

echo "All done organizing your messy messy downloads Folder"


Enter fullscreen mode Exit fullscreen mode

这样做的目的是,它会进入 Scripts 文件夹,删除 organise.sh 脚本并将其移动到 Downloads 文件夹,然后将当前目录改回 Downloads 文件夹。现在,无论何时整理下载文件夹,organize.sh 脚本都不会自动归类到 scripts 文件夹中。

从技术上讲,我们已经完成了组织脚本。但如果你想了解如何将其设置为系统别名,请继续阅读。

别名和 Bashrc

为什么我不想把组织脚本放在脚本文件夹中?因为我想给 .bashrc 文件添加一个别名。这样我就可以在任何时候、任何目录运行单个命令,并让它对我的下载文件夹进行排序。虽然有点过度设计,但这就是你的学习方式。

那么别名是什么?

在一般英语中,别名是指用来识别某人的假名。在编程中,它被定义为某个事物的昵称,其行为方式与你使用原名而非昵称时一样。

Bash 中一个常用的命令是 ls 命令。但人们可能会把它误写成 sl。为了避免 shell 提示它不理解你的意思,你可以设置一个别名,这样每当你输入 sl 时,shell 都会执行 ls 命令。这样的别名类似于:



alias sl=ls


Enter fullscreen mode Exit fullscreen mode

别名的另一个用途是用尽可能少的单词执行详细命令。例如,npx create-react-app newApp你可以使用别名 as来代替直接输入cra newApp。定义如下:



alias cra="npx create-react-app"


Enter fullscreen mode Exit fullscreen mode

你明白我的意思了。那么现在我们的组织别名必须是:



alias organize="cd ~/Downloads && ./organize.sh"


Enter fullscreen mode Exit fullscreen mode

但是这个别名只对当前正在运行的终端有效。如果我们关闭这个终端,这个别名就会丢失。所以我们需要一些持久性。我们可以把它放在 .bashrc 文件中来实现。

巴什尔克???

.bashrc 是一个配置文件,每当用户登录时就会运行。它包括设置或启用:着色、完成、shell 历史记录、命令别名。

要使用 vim 编辑 .bashrc,您只需使用



vim ~/.bashrc


Enter fullscreen mode Exit fullscreen mode

然后转到最后一行并插入此命令



alias organize="cd ~/Downloads && ./organize.sh"


Enter fullscreen mode Exit fullscreen mode

保存文件,然后不要忘记运行,source ~/.bashrc以便您可以在当前终端上实施这些更改。

现在一切都已设置完毕,您可以随时通过运行组织命令来组织您的下载文件夹。

你可以在这里找到 github repo

鏂囩珷鏉ユ簮锛�https://dev.to/w3ndo/basic-bash-automation-a-script-to-organize-my-downloads-folder-44e3
PREV
SHA-2 工作原理(SHA-256)
NEXT
为什么我必须在 JS 中使用依赖注入?它有什么用处?结论