借助 sed 重命名具有 2 个扩展名的系列文件
Rename series of files with 2 extentions by help of sed
我试图在一个文件夹中重命名一些具有 2 个扩展名的文件,该文件夹也有多个文件夹。
例如:
"./3/test/us.bak.alt"
"./3/test/ca.bak.alt"
"./3/test/me.bak.alt"
"./3/test/mi.bak.alt"
"./3/new.BAK.alt"
"./3/alt.bak.alt"
这些应重命名为 *.BAK(因此应删除末尾的 .alt),但前提是 .BAK 文件尚不存在。
我试过这段代码:
find -name "*.alt" | sed 's/\(.*\)\.alt/mv "&" .BAK"/'
输出应该是这样的:
"./3/test/us.BAK"
"./3/test/ca.BAK"
"./3/test/me.BAK"
"./3/test/mi.BAK"
"./3/new.BAK"
"./3/alt.BAK"
我在这里缺少什么?
如果允许您在计算机上安装工具,请考虑使用 rename
(也称为 prename
和 perl-rename
,具体取决于发行版)。当您需要对文件进行定期名称更改时,它很有用。例如,如果您有目录持有说:img001.jpeg
、img002.jpeg
、img003.jpeg
并想将其更改为 .jpg
文件,那么执行
就足够了
rename 's/jpeg/jpg' *.jpeg
您遗漏了几件事:
- 您应该将查找搜索限制为文件。
- 您的
sed
脚本不会将 .bak.alt
替换为 .BAK
,而是将 .alt
替换为 .BAK
。
- 您的
sed
脚本中缺少双引号。
- 您应该将
sed
搜索限制在文件名的末尾。
- 您的输入列表中有一个
new.BAK.alt
文件。
- 您的输入列表中有一个空字符串
""
。
- 您想要的输出列表中有一个
./3/test/us.bak.alt
,这显然与您的规范相矛盾。
让我们忽略最后 3 个问题,它们可能是错别字。要修复其他 4 个,请尝试:
find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" ".BAK"/'
如果第五期是真实的并且您还有 *.BAK.alt
个文件要重命名为 *.BAK
:
find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" ".BAK"/'
使用其中之一,当您对打印输出感到满意时,如果您使用 GNU sed,则可以通过非常小的更改来执行它们:
find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" ".BAK"/;e'
或:
find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" ".BAK"/;e'
(e
sed 命令执行模式 space 的内容)。
我试图在一个文件夹中重命名一些具有 2 个扩展名的文件,该文件夹也有多个文件夹。 例如:
"./3/test/us.bak.alt"
"./3/test/ca.bak.alt"
"./3/test/me.bak.alt"
"./3/test/mi.bak.alt"
"./3/new.BAK.alt"
"./3/alt.bak.alt"
这些应重命名为 *.BAK(因此应删除末尾的 .alt),但前提是 .BAK 文件尚不存在。 我试过这段代码:
find -name "*.alt" | sed 's/\(.*\)\.alt/mv "&" .BAK"/'
输出应该是这样的:
"./3/test/us.BAK"
"./3/test/ca.BAK"
"./3/test/me.BAK"
"./3/test/mi.BAK"
"./3/new.BAK"
"./3/alt.BAK"
我在这里缺少什么?
如果允许您在计算机上安装工具,请考虑使用 rename
(也称为 prename
和 perl-rename
,具体取决于发行版)。当您需要对文件进行定期名称更改时,它很有用。例如,如果您有目录持有说:img001.jpeg
、img002.jpeg
、img003.jpeg
并想将其更改为 .jpg
文件,那么执行
rename 's/jpeg/jpg' *.jpeg
您遗漏了几件事:
- 您应该将查找搜索限制为文件。
- 您的
sed
脚本不会将.bak.alt
替换为.BAK
,而是将.alt
替换为.BAK
。 - 您的
sed
脚本中缺少双引号。 - 您应该将
sed
搜索限制在文件名的末尾。 - 您的输入列表中有一个
new.BAK.alt
文件。 - 您的输入列表中有一个空字符串
""
。 - 您想要的输出列表中有一个
./3/test/us.bak.alt
,这显然与您的规范相矛盾。
让我们忽略最后 3 个问题,它们可能是错别字。要修复其他 4 个,请尝试:
find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" ".BAK"/'
如果第五期是真实的并且您还有 *.BAK.alt
个文件要重命名为 *.BAK
:
find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" ".BAK"/'
使用其中之一,当您对打印输出感到满意时,如果您使用 GNU sed,则可以通过非常小的更改来执行它们:
find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" ".BAK"/;e'
或:
find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" ".BAK"/;e'
(e
sed 命令执行模式 space 的内容)。