仅重命名唯一文件
Rename only unique files
如何通过从文件名中删除“1”来重命名唯一文件并保留重名文件?
输入:
-english_1.pdf
-english_2.pdf
-english_3.pdf
-mathematics_1.pdf
-theology_1.pdf
-economics_1.pdf
-economics_2.pdf
如何使用 awk, sed 或类似的方法从 mathematics_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
我试过了:
rename -n 's/1//' *.pdf
但它删除了 所有 1
一个安全的赌注可能是以下方法:
for file in *_1.pdf; do
[ -f "${file/_1.pdf/_2.pdf}" ] || mv "${file}" "${file/_1.pdf/.pdf}"
done
它的作用如下:
for file in *_1.pdf; do ... done
: 对所有匹配 glob 模式 *_1.pdf
的文件进行循环。所以这匹配所有看起来像 prefix_1.pdf
的文件
[ -f "${file/_1.pdf/_2.pdf}" ]
: 我们在循环中做的第一件事是验证是否存在名称为 prefix_2.pdf
的类似文件.我们通过参数 expansion
获得这个文件名
${parameter/pattern/string}
: Pattern substitution. The pattern
is expanded to produce a pattern just as in pathname expansion, Parameter is expanded and the longest match of pattern
against its value is replaced with string
.
source: man bash
test
命令,写作 [ -f filename ]
检查是否存在带有 filename
的文件。有关详细信息,请参阅 man test
。
如果上面的测试成功,我们什么都不做。如果上述测试不成功,我们使用 mv "${file}" "${file/_1.pdf/.pdf}"
重命名原始文件。这个条件组合是在 OR-list 上使用实现的:
An OR list has the form command1 || command2
. command2
is executed if, and only if, command1
returns a non-zero exit status.
source: man bash
我在这里假设如果 prefix_3.pdf
存在,则文件 prefix_2.pdf
必须存在。
您可以通过在 mv
命令之前添加 echo
来验证上述内容。
如何通过从文件名中删除“1”来重命名唯一文件并保留重名文件?
输入:
-english_1.pdf
-english_2.pdf
-english_3.pdf
-mathematics_1.pdf
-theology_1.pdf
-economics_1.pdf
-economics_2.pdf
如何使用 awk, sed 或类似的方法从 mathematics_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
我试过了:
rename -n 's/1//' *.pdf
但它删除了 所有 1
一个安全的赌注可能是以下方法:
for file in *_1.pdf; do
[ -f "${file/_1.pdf/_2.pdf}" ] || mv "${file}" "${file/_1.pdf/.pdf}"
done
它的作用如下:
for file in *_1.pdf; do ... done
: 对所有匹配 glob 模式*_1.pdf
的文件进行循环。所以这匹配所有看起来像prefix_1.pdf
的文件
获得这个文件名[ -f "${file/_1.pdf/_2.pdf}" ]
: 我们在循环中做的第一件事是验证是否存在名称为prefix_2.pdf
的类似文件.我们通过参数 expansion${parameter/pattern/string}
: Pattern substitution. Thepattern
is expanded to produce a pattern just as in pathname expansion, Parameter is expanded and the longest match ofpattern
against its value is replaced withstring
.source:
man bash
test
命令,写作[ -f filename ]
检查是否存在带有filename
的文件。有关详细信息,请参阅man test
。如果上面的测试成功,我们什么都不做。如果上述测试不成功,我们使用
mv "${file}" "${file/_1.pdf/.pdf}"
重命名原始文件。这个条件组合是在 OR-list 上使用实现的:An OR list has the form
command1 || command2
.command2
is executed if, and only if,command1
returns a non-zero exit status.source:
man bash
我在这里假设如果 prefix_3.pdf
存在,则文件 prefix_2.pdf
必须存在。
您可以通过在 mv
命令之前添加 echo
来验证上述内容。