0

我正在尝试创建一个脚本,该脚本将查找文件夹中包含例如字符串“J34567”的所有文件并处理它们。现在我可以用我的代码处理文件夹中的所有文件,但是,我的脚本不仅会处理包含的字符串,还会处理文件夹中的所有文件。换句话说,一旦我使用字符串名称运行脚本,即使 ./bashexample 'J37264'没有该字符串名称,它仍然会处理所有文件。下面是我的代码:

#!/bin/bash

directory=$(cd `dirname .` && pwd)
tag=$1

echo find: $tag on $directory

find $directory . -type f -exec grep -sl "$tag"  {} \;

for files in $directory/*$tag*
do
    for i in *.std
    do
    /projects/OPSLIB/BCMTOOLS/sumfmt_linux < $i > $i.sum
    done

    for j in *.txt
    do
    egrep "device|Device|\(F\)" $i > $i.fail
    done
    echo $files
done
4

3 回答 3

1

凯文,您可以尝试以下方法:

#!/bin/bash

directory='/home'
tag=$1


for files in $directory/*$tag*
do
    if [ -f $files ]
    then
            #do your stuff
            echo $files
    fi 
done

其中 directory 是您的目录名称(您也可以将其作为命令行参数传递),而 tag 是您在文件名中查找的搜索词。

于 2013-08-14T02:16:58.720 回答
0

以下脚本将为您提供包含(在文件内,而不是在文件名中)给定模式的文件列表。

#!/bin/bash

directory=`pwd`
tag=$1

for file in $(find "$directory" -type f -exec grep -l "$tag" {} \;); do
    echo $file
    # use $file for further operations
done

.std、.txt、.sum 和 .fail 文件与包含给定模式的文件有什么相关性?

它假定文件名中没有特殊字符、空格等。
如果是这种情况,以下应该有助于解决这些问题。
如何在 bash 循环列表中转义空格?
捕获 find 的输出。-print0 到 bash 数组中


您的脚本中有多个问题。

不需要将操作目录设置为当前目录。

directory=$(cd `dirname .` && pwd)

$directory由于和 ,find 对当前目录执行了两次.

find $directory . -type f -exec grep -sl "$tag"  {} \;

此外,上述 find 的结果/输出不用于 for 循环。
对于$directory(未考虑的子目录)中的文件运行 for 循环,其文件名具有给定模式。

for files in $directory/*$tag*

$i以下 for 循环将针对当前目录中的所有 .txt 文件运行,但由于使用了前一个循环,因此只会产生一个输出文件。

for j in *.txt
do
    egrep "device|Device|\(F\)" $i > $i.fail
done
于 2013-08-14T21:45:15.177 回答
0

这是我的临时解决方案。请检查它是否符合您的意图。

#!/bin/bash

directory=$(cd `dirname .` && pwd)  ## Should this be just directory=$PWD ?
tag=$1

echo "find: $tag on $directory"

find "$directory" . -type f -exec grep -sl "$tag" {} \;  ## Shouldn't you add -maxdepth 1 ? Are the files listed here the one that should be processed in the loop below instead?

for file in "$directory"/*"$tag"*; do
    if [[ $file == *.std ]]; then
        /projects/OPSLIB/BCMTOOLS/sumfmt_linux < "$file" > "${file}.sum"
    fi

    if [[ $file == *.txt ]]; then
        egrep "device|Device|\(F\)" "$file" > "${file}.fail"
    fi

    echo "$file"
done

更新 1

#!/bin/bash

directory=$PWD  ## Change this to another directory if needed.
tag=$1

echo "find: $tag on $directory"

while IFS= read -rd $'\0' file; do
    echo "$file"
    case "$file" in
    *.std)
        /projects/OPSLIB/BCMTOOLS/sumfmt_linux < "$file" > "${file}.sum"
        ;;
    *.txt)
        egrep "device|Device|\(F\)" "$file" > "${file}.fail"
        ;;
    *)
        echo "Unexpected match: $file"
        ;;
    esac
done < <(exec find "$directory" -maxdepth 1 -type f -name "*${tag}*" \( -name '*.std' -or -name '*.txt' \) -print0)  ## Change or remove the maxdepth option as wanted.

更新 2

#!/bin/bash

directory=$PWD
tag=$1

echo "find: $tag on $directory"

while IFS= read -rd $'\0' file; do
    echo "$file"
    /projects/OPSLIB/BCMTOOLS/sumfmt_linux < "$file" > "${file}.sum"
done < <(exec find "$directory" . -maxdepth 1 -type f -name "*${tag}*" -name '*.std' -print0)

while IFS= read -rd $'\0' file; do
    echo "$file"
    egrep "device|Device|\(F\)" "$file" > "${file}.fail"
done < <(exec find "$directory" -maxdepth 1 -type f -name "*${tag}*" -name '*.txt' -print0)
于 2013-08-14T20:15:01.853 回答