重命名 for 循环中扩展名找到的所有文件
Rename all files found by extension in for loop
我的任务是编写一个脚本,在给定目录中搜索所有没有 .old
扩展名的文件,并将文件重命名为这种格式:filename.old
。我试过这个脚本:
#!/bin/bash
for i in $(grep "\.[^old]&" | ls)
do
mv "/$i" "/$i.old"
done
但它给出了错误的输出。
- 这些文件在我的目录中:
f1, f2.old, f3, f4.old
。
- 预期输出:
f1.old, f2.old, f3.old, f4.old
。
- 我的输出(第一次启动):
f1.old, f2.old.old, f3.old, f4.old.old
。
每次启动脚本时,它都会不断添加 .old
扩展名,所以它变成这样:
- 我的输出(第二次启动):
f1.old.old, f2.old.old.old, f3.old.old, f4.old.old.old
.
如何改进?
你可以像这样使用单线:
find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old \;
GNU/Linux 上的示例(Ubuntu 14.04 LTS):
mkdir so
cd so
touch f1 f2.old f3 f4.old
find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old \;
ls
结果:
f1.old f2.old f3.old f4.old
解释:
find .
表示在当前目录下查找
-mindepth 1
将 return 没有 return 当前目录 .
的文件(参见 https://askubuntu.com/questions/153770/how-to-have-find-not-return-the-current-directory)
! -name '*.old'
将跳过任何以 .old
结尾的文件
-exec mv
对用 {}
表示的 returned 文件执行 mv
(移动)命令,并为其添加具有 {}.old
含义的扩展名无论文件名是什么-returned.old
您可以像这样修改脚本以获得类似的结果:
test.sh.old
#!/bin/bash
for i in $(find . -mindepth 1 ! -name '*.old'); do
mv "$i" "$i.old"
done
执行 bash test.sh.old
得到类似的结果。
您可能需要尝试一些测试用例以查看单行文件和修改后的 test.sh.old
文件是否通过了这些测试条件。我用您提供的样本对其进行了测试,这 return 是预期的结果。
我的任务是编写一个脚本,在给定目录中搜索所有没有 .old
扩展名的文件,并将文件重命名为这种格式:filename.old
。我试过这个脚本:
#!/bin/bash
for i in $(grep "\.[^old]&" | ls)
do
mv "/$i" "/$i.old"
done
但它给出了错误的输出。
- 这些文件在我的目录中:
f1, f2.old, f3, f4.old
。 - 预期输出:
f1.old, f2.old, f3.old, f4.old
。 - 我的输出(第一次启动):
f1.old, f2.old.old, f3.old, f4.old.old
。 每次启动脚本时,它都会不断添加.old
扩展名,所以它变成这样: - 我的输出(第二次启动):
f1.old.old, f2.old.old.old, f3.old.old, f4.old.old.old
.
如何改进?
你可以像这样使用单线:
find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old \;
GNU/Linux 上的示例(Ubuntu 14.04 LTS):
mkdir so
cd so
touch f1 f2.old f3 f4.old
find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old \;
ls
结果:
f1.old f2.old f3.old f4.old
解释:
find .
表示在当前目录下查找-mindepth 1
将 return 没有 return 当前目录.
的文件(参见 https://askubuntu.com/questions/153770/how-to-have-find-not-return-the-current-directory)! -name '*.old'
将跳过任何以.old
结尾的文件
-exec mv
对用{}
表示的 returned 文件执行mv
(移动)命令,并为其添加具有{}.old
含义的扩展名无论文件名是什么-returned.old
您可以像这样修改脚本以获得类似的结果:
test.sh.old
#!/bin/bash
for i in $(find . -mindepth 1 ! -name '*.old'); do
mv "$i" "$i.old"
done
执行 bash test.sh.old
得到类似的结果。
您可能需要尝试一些测试用例以查看单行文件和修改后的 test.sh.old
文件是否通过了这些测试条件。我用您提供的样本对其进行了测试,这 return 是预期的结果。