如何运行给定目录的所有子目录?

时间:2013-09-12 10:34:23

标签: linux bash shell

我编写了一个直接在当前目录中报告文件的脚本。我想扩展我的脚本,以便它遍历子目录的所有子目录和子目录,依此类推,并进行整体报告。

例如:

enter image description here

my_script > report

创建一个类似的报告:

HEADERS += \ 
    header1.h \
    header2.h \

SOURCES += \ 
    source1.cpp \
    source2.cpp \

但是让我们想象一下我们有子文件夹:

enter image description here

我想做一个递归报告,如:

INCLUDEPATH += "relative path to subfolder1"

"result of my_script for subfolder1"

INCLUDEPATH += "relative path to subfolder2"

"result of my_script for subfolder2"

HEADERS += \ 
    header1.h \
    header2.h \

SOURCES += \ 
    source1.cpp \
    source2.cpp \

我试着看一下类似的问题,但所有这些问题在本质上看起来都不同,并且由一行linux命令回答。我认为我的问题更复杂,因为脚本需要递归调用自己。

编辑:这是我的剧本:

#!/bin/bash

if ls *.h &> /dev/null; then
echo "HEADERS += \ "
printf '    %s \\\n' *.h
echo ""
fi

if ls *.cpp &> /dev/null; then
echo "SOURCES += \ "
printf '    %s \\\n' *.cpp
echo ""
fi

if ls *.ui &> /dev/null; then
echo "FORMS += \ "
printf '    %s \\\n' *.ui
fi

4 个答案:

答案 0 :(得分:3)

  

我认为我的问题更复杂,因为脚本需要递归调用自己。

是否需要递归,或者是否需要为每个调用一次 目录?这个片段应该允许后者:

find ${top:?} -type d | while read dir; do
    (cd $dir && ${name_of_script:?})
done

N.B。:为变量top(树的顶部)和name_of_script添加合适的值。 它们已使用${var:?}编码以捕获未设置的变量并允许代码段失败 正常。

答案 1 :(得分:1)

您可以通过向glob添加尾随/来遍历子目录。

# When there are no matches for a glob, don't treat the glob literally
shopt -s nullglob

# Recursion is avoided when you have no subdirectories
for subdir in */; do
    printf 'INCLUDEPATH += "%s"\n' "$subdir"
    my_script
done

# Arrays aren't strictly necessary, but make things simpler
headers=( *.h )
if [[ $headers ]]; then
    printf 'HEADERS += \\\n'
    for header in "${headers[@]}"; do
        printf '    %s \\\n' "$headers"
    done
fi

sources=( *.cpp )
if [[ $sources ]]; then
    printf 'SOURCES += \\\n'
    for source in "${sources[@]}"; do
        printf '    %s \\\n' "$source"
    done
fi

答案 2 :(得分:0)

使用ls -R *.cpp

-R代表递归

答案 3 :(得分:0)

使用ls -lR mainfolder | grep fileextensiontobereported

例如:ls -lR directory1 | grep .cpp