Мне нужно проверить, существует ли несколько файлов (около 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 можно создавать и использовать псевдонимы (алиасы) для команд.
Делает ли этот 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
${d%/}
.$ 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