Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中的多重和递归文件重命名_Bash_Rename - Fatal编程技术网

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:好,已更新。看起来区别实际上在于内置命令和关键字与外部命令。