我尝试重命名一些文件,其中有两个扩展名的文件夹,其中也有多个文件夹。例如:
"./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 "&" \1.BAK"/'
应该是这样的:
"./3/test/us.BAK"
"./3/test/ca.BAK"
"./3/test/me.BAK"
"./3/test/mi.BAK"
"./3/new.BAK"
"./3/alt.BAK"
我在这里错过了什么?
发布于 2021-10-14 12:28:42
你错过了几件事:
.BAK
.
.alt
是您的sed
脚本中缺少的双引号。H 212H 113
您应该将sed
搜索限制在文件名的末尾。H 215H 116
您的输入列表中有一个new.BAK.alt
文件。H 218H 119
您的输入列表中有一个空字符串""
。H 221
在您的输入列表中有一个<
相矛盾
让我们忽略最后三个问题,他们可能是排字。要修复其他4种方法,请尝试:
find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" "\1.BAK"/'
如果第五个问题是真正的问题,并且您还想将*.BAK.alt
文件重命名为*.BAK
find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" "\1.BAK"/'
对于一个或另一个,当您对打印的输出感到满意时,如果您使用GNU,则可以通过非常小的更改来执行它们:
find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" "\1.BAK"/;e'
或者:
find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" "\1.BAK"/;e'
( e
sed命令执行模式空间的内容)。
发布于 2021-10-14 12:20:47
如果允许您在计算机上安装工具,请考虑使用rename
(也称为prename
和perl-rename
,视发行版而定)。当您需要对文件进行定期的名称更改时,它非常有用。例如,如果您有目录保存(如:img001.jpeg
、img002.jpeg
、img003.jpeg
)并希望将其转换为.jpg
文件,那么就足够了。
rename 's/jpeg/jpg' *.jpeg
https://stackoverflow.com/questions/69570171
复制相似问题