2011-11-15 159 views
2

我在编写bash脚本时很恐怖,但是我想知道是否可以通过目录递归循环并通过“1.png”,“2”重命名其中的所有文件。 PNG“等,但我需要它重新启动一个它为每个新文件夹进入。以下是可用的脚本,但只适用于一个目录。Bash遍历目录并重命名每个文件

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

在此先感谢

编辑 谁能其实写这个代码呢?我不知道如何编写bash,这对我来说很困惑

+0

为每个$ fname添加一个测试,查看它是否为目录,然后再次调用此脚本,并将新目录作为cd目标。另外,如果这是大小的任何内容,您需要阅读有关格式化变量的信息,以便您可以生成像001-999(具有前导零)的数字,而无需在$ cnt值前面管理前缀00的字符串。否则,你会陷入困境,试图弄清楚如何对1.png 10.png 2.png进行排序......祝你好运。 – shellter

+0

排序不是问题,我永远不会有理由对它们进行排序,但我实际上是在找人写出来,因为我不知道如何写bash,我只是迷失在看它 –

回答

3

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

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

型d参数意味着你只想要查找的目录

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

+0

非常感谢!这很有效。它包括它所在的原始文件夹,但我用一个简单的条件修复了这个问题 –

+0

我认为你可以使用'-mindepth 1'参数来排除父文件夹,但是你的查找不能有这个参数。在手册页中查找系统中的find命令或者只是测试它。 – stee1rat

1

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

+0

对不起,但我不知道这意味着什么D: –

+0

@stumpx - 你是否阅读过“find”手册页?你有什么问题?它应该是非常简单的 - 只需用'find'和它的参数的组合来代替脚本中的'*'即可。在你的情况下,也许'$(find。-type f)'。注意文件名中的空格。不过,您的原始脚本也不能正确处理。 –

+0

另一个问题,它重命名文件夹,而不是进入它们并更改文件名 –

相关问题