bash中的多重和递归文件重命名
在bash中的多重和递归文件重命名,bash,rename,Bash,Rename,在Linux中,我有一个具有以下结构的文件夹: . ├── a │ ├── 00000400000000030bfd.dat │ ├── 10000400000000030bfd.dat │ ├── 20000400000000030bfd.dat │ ├── etc.... ├── b │ ├── 00000401000000030bfd.dat │ ├── 10000401000000030bfd.dat │ ├── 20000401000000030bfd.da
Linux
中,我有一个具有以下结构的文件夹:
.
├── a
│ ├── 00000400000000030bfd.dat
│ ├── 10000400000000030bfd.dat
│ ├── 20000400000000030bfd.dat
│ ├── etc....
├── b
│ ├── 00000401000000030bfd.dat
│ ├── 10000401000000030bfd.dat
│ ├── 20000401000000030bfd.dat
│ ├── etc....
├── c
│ ├── 00000402000000030bfd.dat
│ ├── 10000402000000030bfd.dat
│ ├── 20000402000000030bfd.dat
│ ├── etc....
├── d
│ ├── etc....
├── e
│ ├── etc....
├── f
依此类推,直到“p”
文件夹。我想用bash
脚本将每个目录中的.dat
文件重命名为.html
文件。我怎么做?使用循环
for file in {a..p}/*.dat ; do
mv "$file" "${file%.dat}.html"
done
${file%.dat}
使用循环从$file
的值末尾删除.dat
for file in {a..p}/*.dat ; do
mv "$file" "${file%.dat}.html"
done
${file%.dat}
从$file
的值末尾删除.dat
,以下是一个使用所有传统命令的版本:
find log -name "*.dat" |
sed 's/.log$//;s/mv &.dat &.html/' |
bash
本质上,find
创建目标名称列表,sed
使名称通用,然后生成执行重命名的mv
命令,然后将结果传输到bash
执行
可以省略
bash
命令,仅获取眼球测试的mv命令列表。您还可以将-x
添加到bash
命令,以获取执行的每个mv
命令的日志 这是一个使用所有传统命令的版本:
find log -name "*.dat" |
sed 's/.log$//;s/mv &.dat &.html/' |
bash
本质上,find
创建目标名称列表,sed
使名称通用,然后生成执行重命名的mv
命令,然后将结果传输到bash
执行
可以省略
bash
命令,仅获取眼球测试的mv命令列表。您还可以将-x
添加到bash
命令,以获取执行的每个mv
命令的日志 你为自己做了什么?你是怎么失败的?我在'ls-lR'do mv$I$I.html中尝试了for I;完成
和其他组合您自己尝试了什么?你是怎么失败的?我在'ls-lR'do mv$I$I.html中尝试了for I;完成[a-p]/*.dat中文件的
和其他组合单循环?或者甚至是{a..p}/*.dat
来避免语言环境问题。抱歉,刚才看到您提到了这一点。我认为for循环不受命令行长度最大值的限制:touch{000001..1000000}
给出“参数列表太长”<{000001..1000000}中f的代码>;不要触摸$f;完成工作正常。@BenjaminW:好,已更新。看起来区别实际上在于内置命令和关键字与外部命令。对于[a-p]/*.dat中的文件,单循环?或者甚至是{a..p}/*.dat
来避免语言环境问题。抱歉,刚才看到您提到了这一点。我认为for循环不受命令行长度最大值的限制:touch{000001..1000000}
给出“参数列表太长”<{000001..1000000}中f的代码>;不要触摸$f;完成
工作正常。@BenjaminW:好,已更新。看起来区别实际上在于内置命令和关键字与外部命令。