bash - 重命名文件时 bash 循环的性能

标签 bash shell unix

有时我需要重命名一些文件,例如添加前缀或删除某些内容。 起初我写了一个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

它工作但非常慢,可能是因为它需要创建一个进程(这里是 sedmv)并销毁它并再次创建相同的进程只是为了有一个不同的争论。真的吗?如果是这样,如何避免它,我怎样才能获得更快的版本?

我想为所有处理过的文件提供一个名称(使用 sed 一次处理它们),但它仍然需要循环中的 mv

请告诉我,你们是怎么做到的?谢谢。如果您觉得我的问题难以理解,请耐心等待,我的英语不是很好,抱歉。

---更新---

对不起我的描述。我的核心问题是:“如果我们应该在循环中使用一些命令,那会降低性能吗?”因为在 for i in {1..100000};执行 ls 1>/dev/null; done 创建和销毁进程将花费大部分时间。所以我想要的是“有什么方法可以降低成本吗?”。

感谢 kev 和 S.R.I 给了我一个重命名文件的rename解决方案。

最佳答案

每次调用外部二进制文件(lssedmv)时,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/

相关文章:

json - 用文件内容替换关键字

c++ - 将 bash 命令添加到 CMake 测试中

python - 如何在Python中调用一系列bash命令并存储输出

Java进程仍在运行

python - 通过 Pygments 重定向 python 回溯

c - linux终端: Changing images: printing over already printed text游戏

linux - 如何编写一个带一个参数(目录名)的 bash shell 脚本

linux - 执行脚本时找不到邮件命令错误

linux - 需要选择什么样的服务器

c - 错误: identifier "CLOCK_PER_SEC" is undefined