有时我需要重命名一些文件,例如添加前缀或删除某些内容。 起初我写了一个python脚本。它运行良好,我想要一个 shell 版本。因此我写了这样的东西:
$1 - 要列出的目录, $2 - 将替换什么模式, $3 - 替换。
echo "usage: dir pattern replacement"
for fname in `ls $1`
do
newName=$(echo $fname | sed "s/^$2/$3/")
echo 'mv' "$1/$fname" "$1/$newName&&"
mv "$1/$fname" "$1/$newName"
done
它工作但非常慢,可能是因为它需要创建一个进程(这里是 sed
和 mv
)并销毁它并再次创建相同的进程只是为了有一个不同的争论。真的吗?如果是这样,如何避免它,我怎样才能获得更快的版本?
我想为所有处理过的文件提供一个名称(使用 sed
一次处理它们),但它仍然需要循环中的 mv
。
请告诉我,你们是怎么做到的?谢谢。如果您觉得我的问题难以理解,请耐心等待,我的英语不是很好,抱歉。
---更新---
对不起我的描述。我的核心问题是:“如果我们应该在循环中使用一些命令,那会降低性能吗?”因为在 for i in {1..100000};执行 ls 1>/dev/null; done
创建和销毁进程将花费大部分时间。所以我想要的是“有什么方法可以降低成本吗?”。
感谢 kev 和 S.R.I 给了我一个重命名文件的rename
解决方案。
最佳答案
每次调用外部二进制文件(ls
、sed
、mv
)时,bash 都必须 fork 自己来执行命令,而那性能受到很大影响。
你可以在纯 bash 4.X 中做任何你想做的事情,只需要调用 mv
pat_rename(){
if [[ ! -d "$1" ]]; then
echo "Error: '$1' is not a valid directory"
return
fi
shopt -s globstar
cd "$1"
for file in **; do
echo "mv $file ${file//$2/$3}"
done
}
关于bash - 重命名文件时 bash 循环的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628302/