我有一个包含目录名的文件:

my_list.txt:

/tmp
/var/tmp

如果目录名已经存在于文件中,我想在添加目录名之前检入Bash。


当前回答

最简单的方法是:

isInFile=$(cat file.txt | grep -c "string")


if [ $isInFile -eq 0 ]; then
   #string not contained in file
else
   #string is in file at least once
fi

Grep -c将返回该字符串在文件中出现的次数。

其他回答

一个无grep的解决方案,对我来说是有效的:

MY_LIST=$( cat /path/to/my_list.txt )



if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
  echo "It's there!"
else
echo "its not there"
fi

基于: https://stackoverflow.com/a/229606/3306354

我正在寻找一种方法来在终端中做到这一点,并在正常的“grep行为”中过滤行。把你的字符串放在strings.txt文件中:

string1
string2
...

然后你可以构建一个正则表达式(string1|string2|…)并使用它进行过滤:

cmd1 | grep -P "($(cat strings.txt | tr '\n' '|' | head -c -1))" | cmd2

编辑:以上只适用于你不使用任何正则表达式字符,如果需要转义,它可以这样做:

cat strings.txt | python3 -c "import re, sys; [sys.stdout.write(re.escape(line[:-1]) + '\n') for line in sys.stdin]" | ...

关于以下解决方案:

grep -Fxq "$FILENAME" my_list.txt

如果你想知道(像我一样)-Fxq在通俗英语中是什么意思:

F:影响PATTERN的解释方式(固定字符串而不是正则表达式) x:匹配整行 问:嘘……最小的印刷

从男子档案中可以看出:

-F, --fixed-strings
    Interpret  PATTERN  as  a  list of fixed strings, separated by newlines, any of which is to be matched.
    (-F is specified by POSIX.)
-x, --line-regexp
    Select only those matches that exactly match the whole line.  (-x is specified by POSIX.)
-q, --quiet, --silent
    Quiet; do not write anything to standard output.  Exit immediately with zero status  if  any  match  is
          found,  even  if  an error was detected.  Also see the -s or --no-messages option.  (-q is specified by
          POSIX.)

我的版本使用fgrep

  FOUND=`fgrep -c "FOUND" $VALIDATION_FILE`
  if [ $FOUND -eq 0 ]; then
    echo "Not able to find"
  else
    echo "able to find"     
  fi  
grep -Fxq "String to be found" | ls -a

Grep将帮助您检查内容 ls将列出所有的文件