如何使用 bash 脚本修改文件夹中的文件名?

如何使用 bash 脚本修改文件夹中的文件名?

每当我从学校下载 .docx 和 .ppt 文件时,它们总是看起来像这样。

UTF-8"文件%20名称%20示例.docx

每次下载文件时都必须重命名文件,这很烦人,所以我想创建一个 bash 脚本来帮我完成这项工作。

我有一个 School 文件夹,所以我想编写一个 bash 脚本,搜索整个目录和子目录中以“UTF-8”前缀开头的任何文件。

  • 使用 for 循环删除所有以该前缀开头的文件的前缀
  • 在文件名中搜索“%20”的出现次数并将其替换为“ ”
  • 监视 School 文件夹,以便任何时候我下载带有前缀的另一个文件时,它都会运行脚本并立即重命名。

我对 Linux 还很陌生。过去两个小时我一直在研究,但我不知道该怎么做。任何帮助都将不胜感激。谢谢!

答案1

如何使用 systemd.path 监视文件夹中的文件(在本例中为 /opt/download)的基本示例。

/etc/systemd/system/download-monitor.path:

[Unit]
Description=Download Monitor

[Path]
PathExistsGlob=/opt/download/UTF8\"*

[Install]
WantedBy=multi-user.target

接下来,我们需要创建一个与.path 文件具有相同基本名称的.service 文件。

/etc/systemd/system/download-monitor.service:

[Unit]
Description=Download Monitor

[Service]
ExecStart=/opt/bin/filecheck.sh   

最后执行脚本文件。

/opt/bin/filecheck.sh:

#!/bin/bash

shopt -s nullglob extglob

# systemd.path does not pass what changed so we
# rename all .docx and .ppt files starting with
# UTF8\" in the $a folder.
a=/opt/download
for b in $a/UTF8\"*@(.docx|.ppt); do
    c="$a/${b#$a/UTF8\"}"
    mv "$b" "$c" && deurlname "$c"
done

网址名称命令位于 renameutils 包中。

现在我们可以启用并启动路径监视器:

$ systemctl enable download-monitor.path
$ systemctl start  download-monitor.path

答案2

你可以使用因克龙为此目的。它类似于 cron,但使用事件作为触发器。

sudo apt install incron
sudo systemctl enable incron

将当前用户添加到/etc/incron.allow文件:

$ sudo cat /etc/incron.allow 
[sudo] password for myuser: 
myuser

将用户添加到该文件后,您可以incrontab通过该用户编辑文件:

incrontab -e
/home/myuser/test/utfnames      IN_CREATE       /home/myuser/test/renamefiles.sh

如您所见,第一列包含目录路径,第二列包含监视的事件(文件创建),第三列包含命令或脚本路径。

该脚本包含以下内容:

for file in /home/myuser/test/utfnames/*
  do mv $file "$(echo $file | sed 's/UTF-8//' | sed 's/%20/ /g')"
done

不要忘记chmod +x /home/myuser/test/renamefiles.sh

测试:

myuser@ubuntu:~$ touch 'test/utfnames/UTF-8"Some%20File%20Name.docx'
myuser@ubuntu:~$ touch 'test/utfnames/UTF-8"Some%20File%20Name%202.docx'
myuser@ubuntu:~$ sudo systemctl start incron.service 
myuser@ubuntu:~$ ls test/utfnames/
'UTF-8"Some%20File%20Name%202.docx'  'UTF-8"Some%20File%20Name.docx'
myuser@ubuntu:~$ touch 'test/utfnames/UTF-8"Some%20File%20Name%203.docx'
myuser@ubuntu:~$ ls test/utfnames/
'"Some File Name 2.docx'  '"Some File Name 3.docx'  '"Some File Name.docx'

相关内容