Проверить, являются ли какие-либо каталоги в файле списка подкаталогами определенного каталога

Чтобы ответить на заглавный вопрос :, вы не использовали sudoв этой команде.

0
07.05.2020, 18:37
3 ответа

Недостаток использования grepзаключается в том, что либо вам нужно разрешить регулярные выражения, чтобы можно было привязать совпадение шаблона к началу строки, либо вам нужно отключить регулярные выражения и надеяться, что каждое совпадение шаблона и цели имеет общий и неповторяющийся префикс -.

Проблема с регулярными выражениями заключается в том, что шаблон типа ^/mnt/one.two/будет соответствовать строке /mnt/one/two/. Проблема с фиксированными строками заключается в том, что /mnt/one/two/может соответствовать /one/two/.

Другой подход заключается в использовании awkдля сравнения пути к целевому каталогу с каждой строкой по очереди, гарантируя, что начало целевого каталога и начало шаблона совпадают. Предполагая, что у вас есть список каталогов вfile:

dir="/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/"
awk -v dir="$dir" '$0 == substr(dir, 1, length($0))' file

И вывод для вашего примера

/mnt/Transfer/Downloads/Documents/Thesis/Drafts/
2
28.04.2021, 23:15

Когда

$ dir="/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/"
$ cat file
/mnt/Transfer/Downloads/Documents/ProjectProposal/
/mnt/Transfer/Downloads/Documents/ProjectDesign/
/mnt/Transfer/Downloads/Documents/Thesis/Drafts/
...

тогда, если вас интересует только наличие совпадения, и вам все равно, какая строка в файле соответствует:

if echo "$dir" | grep -q -f file; then
  echo "a match exists in the file"
else
  echo "no match"
fi
1
28.04.2021, 23:15

С perlиrindex:

dir=/mnt/Transfer/Downloads/Documents/Thesis/Drafts/images/
perl -lsne 'print if rindex($dir, $_, 0) == 0' -- -dir="$dir" < file
1
28.04.2021, 23:15

Теги

Похожие вопросы