如何通过从文件名中删除“1”并保留重复名称文件来仅重命名唯一文件?
输入:
-english_1.pdf
-english_2.pdf
-english_3.pdf
-mathematics_1.pdf
-theology_1.pdf
-economics_1.pdf
-economics_2.pdf
Run Code Online (Sandbox Code Playgroud)
如何使用awk、sed或类似工具从math_1.pdf 和theology_1.pdf 中删除1?
所需的输出:
-english_1.pdf
-english_2.pdf
-english_3.pdf
-mathematics.pdf
-theology.pdf
-economics_1.pdf
-economics_2.pdf
Run Code Online (Sandbox Code Playgroud)
我试过:
rename -n 's/1//' *.pdf
Run Code Online (Sandbox Code Playgroud)
但它会删除所有的1
一个安全的赌注可能是以下方法:
for file in *_1.pdf; do
[ -f "${file/_1.pdf/_2.pdf}" ] || mv "${file}" "${file/_1.pdf/.pdf}"
done
Run Code Online (Sandbox Code Playgroud)
它的作用如下:
for file in *_1.pdf; do ... done:对匹配 glob 模式的所有文件进行循环*_1.pdf。所以这匹配所有看起来像的文件prefix_1.pdf[ -f "${file/_1.pdf/_2.pdf}" ]:我们在循环中做的第一件事是验证是否存在名称相似的文件prefix_2.pdf。我们通过参数扩展获得这个文件名
${parameter/pattern/string}:模式替换。将pattern被扩展,以产生图案,就像路径扩展,参数被膨胀和最长匹配pattern针对其值被替换为string。来源:
man bash
该test命令编写为[ -f filename ]检查文件是否filename存在。有关man test更多信息,请参阅。
如果上面的测试成功,我们什么都不做。如果上述测试不成功,我们使用 .rename 重命名原始文件mv "${file}" "${file/_1.pdf/.pdf}"。这种条件组合是使用 OR 列表实现的:
OR 列表的形式为
command1 || command2。command2当且仅当command1返回非零退出状态时才执行。来源:
man bash
我在这里假设文件prefix_2.pdf必须存在(如果prefix_3.pdf存在)。
您可以通过echo在mv命令前添加来验证上述内容。