![终端-根据通配符重命名文件](https://linux22.com/image/1569169/%E7%BB%88%E7%AB%AF-%E6%A0%B9%E6%8D%AE%E9%80%9A%E9%85%8D%E7%AC%A6%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.png)
我有一个场景,文件夹中有两个文件:
1)Foo bar.pdf
2)另一个文件.pdf
我正在将两个文件合并为一个。生成的文件必须命名为“Foo.pdf”。
因此.sh 文件将包含以下函数:
检查*.pdf 是否包含“bar”//检查文件夹中所有 PDF 的文件名中是否包含单词“bar”。
如果为 TRUE ($value = "Foo.pdf")//从文件名中提取“Foo”
mkfile = $value.pdf
因此,我最终会得到如下结果:
(目录 1)
文件 1:Foo Blah Blah 123.pdf
文件 2:另一个文件.pdf
...运行脚本...
文件 3:Foo.pdf//创建文件
希望这有意义?有人能给我指出正确的方向吗?
答案1
以下是一种方法:
for FILE in *bar.pdf; do
NEWNAME=$(echo $FILE | sed -En 's/(.*)bar.pdf/\1.pdf/p')
mv $FILE $NEWNAME
done
解释:这使用 的bash
for 循环语法和 shell 通配符(基于通配符的文件名匹配)来处理以“bar.pdf”结尾的每个文件。它获取每个文件的名称并将其发送到sed
。sed
被告知记住文件名中“bar.pdf”之前的部分,然后用记住的部分替换文件名,并在末尾附加“.pdf”。该新文件名存储为 NEWNAME。然后mv
调用 以将文件重命名为新名称,循环继续处理下一个文件(如果还有其他文件与 *bar.pdf 匹配)。
(使用 macOS High Sierra 10.13.6 的内置bash
和进行测试sed
。您的系统工具可能会有所不同。我很确定sed
Linux 中的 GNU 使用与 macOS 中基于 BSD 的命令行选项不同的命令行选项sed
,因此请先检查您当地的sed
手册页。)