终端 - 基于通配符重命名文件


0

我有一个场景,我在一个文件夹中有两个文件:

1)Foo bar.pdf

2)另一个File.pdf

我将两个文件合并为一个。生成的文件必须命名为“Foo.pdf”。

所以.sh文件将包含以下函数:

检查* .pdf是否包含“bar”//检查文件夹中文件名中“bar”一词的所有PDF。

如果为TRUE($ value =“Foo.pdf”)//从文件名中提取“Foo”

mkfile = $ value.pdf

因此,我最终会得到以下内容:

(目录1)

文件1:Foo Blah Blah 123.pdf

文件2:另一个File.pdf

...运行脚本......

文件3: Foo.pdf //创建文件

希望有道理吗?有谁能指出我正确的方向?


目前尚不清楚你究竟想做什么,但你需要的是什么 bash 参数解析:在文件路径中, ${FilePath%/*} 是目录路径, ${FilePath##*/} 是文件名和 [ "${FileName#*bar} != "SFileName" ] 测试 bar 在文件名中。你重命名 mv,但旧名称中的任何目录路径必须存在于新名称中(否则,文件将被重命名并移动到当前目录)。
AFH

@AFH我编辑了我的问题,使其更清晰一点。感谢您的评论,它确实给了我一个开始。
Guit4eva

如果你遇到困难,请告诉我。
AFH

因此,您尝试在名称中间找到具有特定子字符串的所有文件,然后重命名这些文件以便从其文件名中删除该子字符串。那是对的吗?
Spiff

Answers:


0

这是一种方式:

for FILE in *bar.pdf; do
    NEWNAME=$(echo $FILE | sed -En 's/(.*)bar.pdf/\1.pdf/p')
    mv $FILE $NEWNAME
done

说明:这用 bash 用于循环语法和shell globbing(基于通配符的文件名匹配)来处理以“bar.pdf”结尾的每个文件。它采用每个文件的名称并将其发送到 sedsed 被告知要记住“bar.pdf”之前文件名的一部分,然后用记忆部分替换文件名,并在末尾附加“.pdf”。该新文件名存储为NEWNAME。然后 mv 被调用以将文件重命名为其新名称,循环继续处理下一个文件(如果有更多文件匹配* bar.pdf)。

(使用macOS High Sierra 10.13.6的内置测试 bashsed。您系统的工具可能会有所不同。我很确定GNU sed 在Linux中使用与基于BSD不同的命令行选项 sed 在macOS中,请检查您的本地 sed 首页。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.