如何循环输入文本文件中的bash文件名列表,并为每个文件名grep目录中的每个文件(查看文件中是否包含文件名)并输出到文本所有文件名在任何文件中都找不到?
#!/bin/sh
#This script will be used to output any unreferenced bash files
#included in the WebAMS Project
#Read file path of bash files and file name input
SEARCH_DIR=$(awk -F "=" '/Bash Dir/ {print $2}' bash_input.txt)
FILE_NAME=$(awk -F "=" '/Input File/ {print $2}' bash_input.txt)
echo $SEARCH_DIR
echo $FILE_NAME
exec<$FILE_NAME
while read line
do
echo "IN WHILE"
if (-z "$(grep -lr $line $SEARCH_DIR)"); then
echo "ENTERED"
echo $filename
fi
done
答案 0 :(得分:1)
将其另存为search.sh
,根据您的环境更新SEARCH_DIR
:
#!/bin/bash
SEARCH_DIR=some/dir/here
while read filename
do
if [ -z "$(grep -lr $filename $SEARCH_DIR)" ]
then
echo $filename
fi
done
然后:
chmod +x search.sh ./search.sh files-i-could-not-find.txt
答案 1 :(得分:0)
可以通过grep
和find
命令
while read -r line; do (find . -type f -exec grep -l "$line" {} \;); done < file
或强>
while read -r line; do grep -rl "$line"; done < file
-r
- &gt;递归
-l
- &gt; files-with-matches(显示包含搜索字符串的文件名)
它将读取输入文件中存在的所有文件名,并搜索包含readed文件名的文件名。如果找到任何,则返回相应的文件名。
答案 2 :(得分:0)
您在if
声明中使用常规括号而不是方括号。
方括号是 test 命令。您正在做的是运行测试(在您的情况下,字符串是否长度为零。如果测试成功,[ ... ]
命令将返回零退出代码。{{1} }语句看到退出代码并运行if
语句的then
子句。否则,如果存在if
语句,则运行该语句。
由于else
实际上是命令,因此 必须 在每一侧留下空白。
[ .. ]
if [ -z "$string" ]
如果[-z $ sting]#在&#34; $ string&#34;是空的或包含空格
顺便说一句,以下是相同的:
if [-z "$string"] # Need white space around the brackets
小心if test -z "$string"
if [ test -z "$string" ]
命令。如果返回的字符串中有空格或NL,则可能无法按照您的想法执行操作。