ПРИМЕЧАНИЕ: Я попытался реализовать эту логику ниже для каждого подкаталога. Но не смог.
#!/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
.