Bash 如何测试文件中是否列出了路径?

Bash 如何测试文件中是否列出了路径?,bash,shell,relative-path,Bash,Shell,Relative Path,对于windows脚本,我提出了几乎完全相同的问题,但现在我需要在linux中也这样做 我有一个脚本,可以递归地查找所有.h文件,并检查同一目录中是否有同名的.cpp文件。到目前为止,这是可行的,但现在我想使用一个Exclude.txt文件,其中包含应该排除的文件夹。我的问题是,$file是完整路径,但在Exclude.txt中,我只想列出与$pwd相关的路径。我该怎么做 #!/bin/bash for file in $(find ${PWD} -name '*.h'); do fi

对于windows脚本,我提出了几乎完全相同的问题,但现在我需要在linux中也这样做

我有一个脚本,可以递归地查找所有
.h
文件,并检查同一目录中是否有同名的
.cpp
文件。到目前为止,这是可行的,但现在我想使用一个
Exclude.txt
文件,其中包含应该排除的文件夹。我的问题是,
$file
是完整路径,但在
Exclude.txt
中,我只想列出与
$pwd
相关的路径。我该怎么做

#!/bin/bash
for file in $(find ${PWD} -name '*.h'); do 
    fileWithoutPath=$(basename $file)
    fileWithoutExtension=${fileWithoutPath%.*}
    prefix="$(dirname $file)/"
    suffix=".cpp"
    cppFile=$prefix$fileWithoutExtension$suffix

    if ??? path is not listed in ./Exclude.txt  ???   <--- what to put here?
        if [ -f "$cppFile" ]
        then
            echo "FILE EXISTS"
        else 
            echo "FILE DOES NOT EXIST"
        fi
    fi      
done
然后应忽略
/u/workingDir/foo/
中的所有文件。

relPathToFile=${file#$PWD}从开头删除$PWD
relPathToFile=${file#$PWD}      # remove $PWD from beginning
while read -r excludePath; do
    if [[ $relPathToFile == $excludePath/* ]]; then
        if [[ -f $cppFile ]]; then
            ...
    fi
 done < './Exclude.txt'
而read-r排除路径;做 如果[[$relPathToFile==$excludePath/*];然后 如果[-f$cppFile]];然后 ... fi 完成<'./Exclude.txt'
relPathToFile=${file#$PWD}#从开头删除$PWD
而read-r排除路径;做
如果[[$relPathToFile==$excludePath/*];然后
如果[-f$cppFile]];然后
...
fi
完成<'./Exclude.txt'

您可以使用
readlink-f$some file\u name
获取完整的文件名,然后您可以只检查文件是否在列表中。

您可以使用
readlink-f$some file\u name
获取完整的文件名,然后您可以只检查文件是否在列表中。

想法:切断
$PWD
前缀,然后您可以
grep
查看文件中的结果

这将切断当前目录前缀
$filename

stripped_file=${filename##$PWD/}
例如:

script is in:         /u/workingDir/
Exclude has a line:   foo
$ cd /tmp
$ echo $PWD
/tmp
$ filename='/tmp/foo.txt'
$ echo ${filename##$PWD/}
foo.txt
重复使用此技巧,查看相对路径是否包含剥离文件名:

if [ "$stripped_file_name" != "${stripped_file_name##$relative_path}" ]; then
   # hey, removing the relative path worked, so the file must be
   # on the relative path; go on.
fi

否则,您可能会将
$PWD
前置到相对路径,使其成为绝对路径,并查看它们是否是绝对文件路径的前缀。

想法:切断
$PWD
前缀,然后您可以
grep
查看文件中的结果

这将切断当前目录前缀
$filename

stripped_file=${filename##$PWD/}
例如:

script is in:         /u/workingDir/
Exclude has a line:   foo
$ cd /tmp
$ echo $PWD
/tmp
$ filename='/tmp/foo.txt'
$ echo ${filename##$PWD/}
foo.txt
重复使用此技巧,查看相对路径是否包含剥离文件名:

if [ "$stripped_file_name" != "${stripped_file_name##$relative_path}" ]; then
   # hey, removing the relative path worked, so the file must be
   # on the relative path; go on.
fi

否则,您可以将
$PWD
前置到相对路径,使其成为绝对路径,并查看它们是否是绝对文件路径的前缀。

您可以调用perl one liner将
$prefix
的绝对路径转换为相对于
$PWD
的相对路径(我们称之为
$relPath
):


您可以调用perl one liner将
$prefix
的绝对路径转换为相对于
$PWD
的相对路径(我们称之为
$relPath
):


@Gnqz完全正确。@Gnqz完全正确。你能解释一下这应该做什么吗?当我试着这样做时,情况似乎总是正确的,也许我对这个问题不够清楚。Exclude.txt中没有与前缀完全匹配的行。相反,我想在Exclude.txt中列出与$pwd相关的路径。例如:脚本在$pwd中运行,Exclude.txt包含somePath,那么$pwd\somePath\应该被排除,但是
$prefix
没有包含相对于
$pwd
的路径吗?哦,当然,我没有注意到您正在执行
查找“$pwd”
。我来编辑。你能解释一下这是怎么回事吗?当我试着这样做时,情况似乎总是正确的,也许我对这个问题不够清楚。Exclude.txt中没有与前缀完全匹配的行。相反,我想在Exclude.txt中列出与$pwd相关的路径。例如:脚本在$pwd中运行,Exclude.txt包含somePath,那么$pwd\somePath\应该被排除,但是
$prefix
没有包含相对于
$pwd
的路径吗?哦,当然,我没有注意到您正在执行
查找“$pwd”
。我将进行编辑。但完整文件名还包含$pwd部分,我不想在Exclude.txtTry this中列出此部分。可以修改shell脚本以排除从exclude.txt文件读取的文件。但是完整文件名还包含$pwd部分,我不想在exclude.txt中列出此部分。请尝试此操作。可以修改shell脚本以排除从exclude.txt文件读取的文件。这几乎就是我所需要的
stripped_file
仍然包含文件名,但我只需要(相对)路径,这样我就可以排除完整的子目录,而不必在exclude.txt中列出单个文件。这几乎是我所需要的
stripped_file
仍然包含文件名,但我只需要(相对)路径,这样我就可以排除完整的子目录,而不必在exclude.txt中列出单个文件