如果在 bash 中包含特定文件名,则仅列出目录

list only directory if contain a specific file name in bash

大家好,我需要有关 bash 命令的帮助。

这是交易:

我有几个目录:

例如

path1/A/path2/
 file1
 file2
path1/B/path2/
 file1
path1/C/path2/
 file1
 file2
path1/D/path2/
 file1
 file2

和一个/path_to_this_file/file.txt

A
B
C
D

我使用的,例如:

cat /path_to_this_file/file.txt | while read line; do ls path1/$line/path2/

然后我可以列出路径中的所有内容但是我想只对没有 file2path2 做一个 ls 进入他们的目录..

此处只应列出 path1/B/path2/

有人有代码吗?

在您的代码中添加了 if 语句:

cat /path_to_this_file/file.txt |
    while read line
    do
        if [ ! -f "path1/$line/path2/file2" ]; then
            ls path1/$line/path2/
        fi
    done

或者:

xargs -I {} bash -c "[ ! -f "path1/{}/path2/file2" ] && ls path1/{}/path2" < /path_to_this_file/file.txt

这样就可以了

while read line; do
    ls "path1/$line/path2/file2" &> /dev/null || ls "path1/$line/path2"
done < /path_to_this_file/file.txt

仅使用 mapfile 又名 readarray bash4+for loop

#!/usr/bin/env bash

mapfile -t var < path_to_this_file/file.txt

for i in "${var[@]}"; do
  if [[ ! -e path1/$i/path2/file2 ]]; then
    ls "path1/$i/path2/"
  fi
done

上面代码中的ls

 ls "path1/$i/path2/" 

输出是

file1

如果您只想打印 PATH,请将 ls "path1/$i/path2/" 更改为

echo "path1/$i/path2/" 

输出是

path1/B/path2/

如果你想同时打印 PATH 和文件使用

echo "path1/$i/path2/"*

输出是

path1/B/path2/file1