递归遍历目录并对目录中的文件运行命令

Mar*_*ars 6 linux unix java bash command-line

我试图反编译包含在某个目录中的所有 Java 类,从目录的顶部开始。

目录下有很多子目录,每个子目录的深度都不一样。

我想要做的是进入每个目录,如果内容是带有后缀的文件.class,则运行反编译命令,这将在同一目录中创建一个反编译文件。

我已经尝试了以下但他们没有达到我所追求的。

第一种方法是:

for dir in ./*; do ( ( if [[ -d $dir ]]; then cd "$dir"; fi ) && ( for f in "$dir"; do ( if [[ -f $f && $f == *".class"* ]]; then jad "$f"; fi ); done ) ); done
Run Code Online (Sandbox Code Playgroud)

这里的问题是它不是递归的。也许这可以以递归的方式进行调整?

第二种方法简单得多,但它输出顶级目录中的文件。虽然这可能没问题,但不幸的是,我有一些具有相同名称但在不同包中的类,因此该解决方案也不起作用:

find . -type f -name "*.class" | while read filename; do echo $filename; done
Run Code Online (Sandbox Code Playgroud)

可以调整其中之一来实现我想要的吗?如何将第一个命令转换为递归操作?

Mar*_*ars 0

我\xe2\x80\x99ve想出了一个对我有用的解决方案:

\n\n
find . -type d | while read dir; do ( if [[ -d $dir ]]; then cd $dir && find . -maxdepth 1 -type f | while read f; do ( jad $f ); done fi ); done\n
Run Code Online (Sandbox Code Playgroud)\n\n

无需if声明即可检查文件类型是否正确,因为如果文件不是类文件,jad 将不会执行反编译。

\n