搜索存在于数组中的文件模式是否存在文件

时间:2015-02-21 08:50:55

标签: arrays file search ksh

我有两个数组,一个有要搜索的文件路径,另一个有要分离的文件。例如 searchfile.dat会有 文件: abc303 XYZ123

我必须搜索可能是abc303 * .dat或任何扩展名的文件。 abc303 * .dat.gz

如果我给*,下面的代码不起作用,只有当我在searchfile.dat中给出要搜索的确切文件名时,它才有效,我也试过没有引号而没有反斜杠。

我正在使用ksh

while [[ $i -lt ${#filearray[@]}  ]];do
while [[ $j -lt ${#filepath[@]} ]];do
found=0
if [[ -a  "${filepath[$j]}/${filearray[$i]}"\* ]]; then
echo ${filepath[$j]}/${filearray[$i]} "found"

2 个答案:

答案 0 :(得分:0)

这是代码

#!/usr/bin/ksh
set -A filearray $(cat searchfile.dat)
fp1=/home/n221/fp1
fp2=/home/n221/fp2

set -A filepath $fp1 $fp2 $fp3
i=0
j=0
while [[ $i -lt ${#filearray[@]}  ]];do
while [[ $j -lt ${#filepath[@]} ]];do
found=0
echo ${filepath[$j]}/${filearray[$i]} "${filepath[$j]}/${filearray[$i]}"
if [[ -a "${filepath[$j]}/${filearray[$i]}"\* ]]; then    
echo ${filepath[$j]}/${filearray[$i]} "found"
found=1
elif [[ $found -eq 0 ]]; then
echo ${filearray[$i]} "not found in " ${filepath[$j]}
fi
(( j=j+1 ))
done
found=5
j=0
(( i=i+1 ))
done

输出

${filepath[$j]}/${filearray[$i]}  /home/n221/fp1/b.dat
b.dat not found in  /home/n221/fp1
${filepath[$j]}/${filearray[$i]}  /home/n221/fp2/b.dat
b.dat not found in  /home/n221/fp2

我在/ home / n221 / fp1路径中放置了一个b.dat.gz文件 在searchfile.dat中,我放置了“d.dat”

答案 1 :(得分:0)

主要问题是测试if [[ -a "${filepath[$j]}/${filearray[$i]}"\* ]] 双方括号具有特殊含义,您的脚本可以更好地使用

if [ -a "${filepath[$j]}/${filearray[$i]}"\* ]

我对通配符不太满意,但是当你有多个文件时它仍然有用。

我会避免像这样的数组:

#!/usr/bin/ksh
fp1=/home/n221/fp1
fp2=/home/n221/fp2

filepath="$fp1 $fp2 $fp3"
i=0
j=0
cat searchfile.dat | while read file; do
        for path in  ${filepath}; do
                found=0
                echo Searching ${path}/${file}
                if [ -a "${path}/${file}"* ]; then
                        echo ${file}/${file} "found"
                        found=1
                elif [[ $found -eq 0 ]]; then
                        echo ${file} "not found in " ${path}
                fi
                (( j=j+1 ))
        done
        found=5
        j=0
        (( i=i+1 ))
done

也许你可以避免使用find的循环,从

开始
filepath="$fp1 $fp2 $fp3"
filebases="-name b.dat* -o -name notfound.dat* -o -name otherfile.dat*"
find ${filepath} ${filebases}