我想循環遍歷每個子目錄並檢查 *.v 或 *.sv 檔案是否存在,如果存在則使用 csh 腳本執行一些操作?

我想循環遍歷每個子目錄並檢查 *.v 或 *.sv 檔案是否存在,如果存在則使用 csh 腳本執行一些操作?

注意:我嘗試為每個子目錄實現以下邏輯。但無法這樣做。

#!/bin/csh -f
 
setenv option $<
switch ($option)
cd $option
foreach i (`ls`)
pushd $i
foreach j (`ls *.v *.sv`)
#sed -nE 's/^module +([^ (#]+) *[#(].*$/\1/p' $j > mod_name.txt
awk -F'[ \t#(;]+' '/^module/{ print $2}' $j > mod_name.txt
foreach k (`cat mod_name.txt`)
sed -r -i "s/^[ ]*$k/${k}_ext/g" $j
end
end
popd
end

在這裡,我將只傳遞父目錄名稱,然後我的腳本將循環遍歷每個子目錄並檢查 *.v 和 *.sv 檔案以執行一些操作並檢查其他目錄等。

pv_ncvlog 是父目錄名稱。
例如 :

**cd pv_ncvlog**/


SKIP_lna64    bin.hppa/     bin.lnppc/    bin.sun4/     bin/          etc/          lost+found/   test/         
SKIP_lnppc    bin.ibmrs/    bin.lnx86/    bin.sun4v/    customer_lib/ ict/          rd_inca_test/ vplan/        
bin.all/      bin.lna64/    bin.sol86@    bin.wint/     docs/         ifcs/         stream_mgmt/ 

答案1

我的解決方案是使用bash。如果您需要 Bourne Shell,請使用for file in $dir/*.v $dir/*.sv

for dir in $(find . -type d)  # generate all subdirectories
do 
    for file in $dir/*.{v,sv} # generate names of all .v and .sv files
    do 
        # The if below is required because a literal 
        # DIRECTORYNAME/*.{v,sv} will be generated  
        # as $file if there is no file that matches 
        # the wildcard
        if [ -f $file ]        
        then echo $file       # replace this with your awk code
        fi
    done
done

請注意,find會產生目前樹中的所有目錄。如果您只需要第一級目錄,請新增-maxdepth 1.

相關內容