如果在 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/
然后我可以列出路径中的所有内容但是我想只对没有 file2
的 path2
做一个 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
大家好,我需要有关 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/
然后我可以列出路径中的所有内容但是我想只对没有 file2
的 path2
做一个 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