Использование ls для поиска нескольких файлов с подстановочными знаками - эхо, какие конкретные файлы не существуют

Мне нужно проверить, существует ли несколько файлов (около 30) в нескольких каталогах. Файлы имеют разные префиксы (соответствующие имени каталога, например, sub1/sub1_file1.txt, sub2/sub2_file1.txt, sub3/sub3_file1.txt; sub1/sub1_file2.txt, sub2/sub2_file2.txt и т. д.). Я использую ls для достижения этого, и это работает, однако мой скрипт печатает только то, существуют ли файлы или нет, но не какие именно. В частности, я хочу знать, какие файлы НЕ существуют в каких каталогах. Кто-нибудь может мне помочь? Я использую Баш. Что у меня есть до сих пор:

for d in */ ; do 
cd "$d"
if ls *_file1.txt *_file2.txt *_file3.txt > /dev/null 2>&1; then
// nothing
else
echo "$d" "files do not exist" >> missingFiles.txt
fi
cd ..
done

В MissingFiles.txt в настоящее время у меня есть (например)

sub1/ файлы не существуют

И я хотел бы

sub1/sub1_file1.txt не существует

Спасибо.

Обновлено: пример каталога

sub1
|_sub1_file1.txt
|_sub1_file2.txt
|_sub1_file3.txt
sub2
|_sub2_file1.txt
|_sub2_file2.txt
|_sub2_file3.txt
sub3
|_sub3_file1.txt
|_sub3_file2.txt

Мне нужно проверить, все ли файлы (файл1, файл2, файл3) присутствуют во всех «подкаталогах». В примере скрипт должен вернуть, что sub3_file3.txt отсутствует (или file3 в sub3). В каждом каталоге есть и другие файлы, которые мне не интересно проверять.

🤔 А знаете ли вы, что...
С помощью Bash можно создавать и использовать псевдонимы (алиасы) для команд.


1
58
2

Ответы:

Решено

Делает ли этот Shellcheck-чистый код Bash то, что вы хотите?

#! /bin/bash -p

for d in */; do
    for f in _file1 _file2 _file3; do
        path=$d${d%/}$f.txt
        [[ -e $path ]] || printf "'%q' does not exist\n" "$path"
    done
done >missingFiles.txt

$ tree
.
├── data
│   ├── sub1
│   │   ├── sub1_file1.txt
│   │   ├── sub1_file2.txt
│   │   └── sub1_file3.txt
│   ├── sub2
│   │   ├── sub2_file1.txt
│   │   ├── sub2_file2.txt
│   │   └── sub2_file3.txt
│   └── sub3
│       ├── sub3_file1.txt
│       └── sub3_file2.txt
└── script.sh

script.sh

#!/bin/bash

awk -F'[/_.]' '
    {
        dirs[$(NF-2)]; files[$(NF-1)]; map[$(NF-2)"-"$(NF-1)]
    } 
    END{
        for (d in dirs)
            for (f in files)
                if (d"-"f in map == 0) printf "%s in %s is missing\n", f, d 
    }
' < <(find ./data -type f -name "sub[1-3]_file[1-3].txt")

Выход:

 $ ./script.sh
 file3 in sub3 is missing