我正在尝试创建一个脚本,该脚本将查找文件夹中包含的所有文件,例如字符串'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
答案 0 :(得分: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是您在文件名中查找的搜索词。
答案 1 :(得分: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)
答案 2 :(得分: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文件与包含给定模式的文件的相关性是什么?
假设文件名中没有特殊字符,空格等
如果是这样的话应该有助于解决这些问题
How can I escape white space in a bash loop list?
Capturing output of find . -print0 into a bash array
您的脚本中存在多个问题。
无需将以下操作目录设置为当前目录。
directory=$(cd `dirname .` && pwd)
由于$directory
和.
,查找对当前目录执行了两次。
find $directory . -type f -exec grep -sl "$tag" {} \;
此外,上述find的结果/输出不用于for循环
对于$directory
(未考虑的子目录)中的文件运行循环,其文件名具有给定的模式。
for files in $directory/*$tag*
以下for循环将针对当前目录中的所有.txt文件运行,但由于使用了前一循环中的$i
,因此只会生成一个输出文件。
for j in *.txt
do
egrep "device|Device|\(F\)" $i > $i.fail
done