每当我从学校下载 .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'