【问题标题】:Bash loop through directory and rename every fileBash遍历目录并重命名每个文件
【发布时间】:2011-12-29 04:34:12
【问题描述】:

我在编写 bash 脚本方面很糟糕,但我想知道是否可以递归循环遍历一个目录并将其中的所有文件重命名为“1.png”、“2.png”等,但我需要对于它输入的每个新文件夹,它都会重新启动。这是有效的脚本,但仅适用于一个目录。

cd ./directory
cnt=1
for fname in *
do
    mv $fname ${cnt}.png
    cnt=$(( $cnt + 1 ))
done

提前致谢

编辑 任何人都可以真正写出这段代码吗?我不知道怎么写 bash,这让我很困惑

【问题讨论】:

  • 为每个$fname添加一个测试,看看是不是一个目录,然后再次调用这个脚本,新的目录作为cd目标。此外,如果这是任何大小,您将需要阅读有关格式化变量的信息,这样您就可以生成像 001-999 (带有前导零)这样的数字,而无需管理在 $cnt 值前面添加 00 的字符串。否则你会被困在试图弄清楚如何排序 1.png 10.png 2.png ... 祝你好运。
  • 排序不是问题,我永远没有理由对它们进行排序,但我实际上是在找人写出来,因为我不知道如何写 bash,我看着就迷路了

标签: bash loops rename


【解决方案1】:

使用 find 是个好主意。您可以使用 find 和下一个语法来查找目录中的所有目录并将脚本应用于找到的目录:

find /directory -type d -exec youscript.sh {} \;

-type d 参数表示你只想找到目录

-exec youscript.sh {} \;为每个找到的目录启动脚本并将此目录名称作为参数传递给它

【讨论】:

  • 非常感谢!这非常有效。它包括它所在的原始文件夹,但我用一个简单的条件修复了它
  • 我认为你可以使用-mindepth 1参数来排除父文件夹,但是你的find不能有这个参数。在手册页中查找系统中的 find 命令或进行测试。
  • 我知道这篇文章已经很老了,但我有一个问题。我正在做类似的事情,但由于某种原因,我得到错误 find: myscript.sh: No such file or directory。我从我的父目录中调用该命令。 myscript.sh 也在这个目录中。有任何想法吗? @stee1rat
【解决方案2】:

使用find(1) 获取文件列表,然后对该列表执行任何您喜欢的操作。

【讨论】:

  • 对不起,我不知道这意味着什么 D:
  • @stumpx - 你读过find 手册页吗?你有什么问题?它应该非常简单 - 只需将脚本中的 * 替换为 find 及其参数的某种组合即可。在你的情况下,也许是$(find . -type f)。注意文件名中的空格。不过,您的原始脚本也不能正确处理。
  • 另一个问题,它是重命名文件夹而不是进入它们并更改文件名
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
相关资源
最近更新 更多