Как убедиться, что в каталоге есть только определенные подкаталоги?

Не уверен, что вы имеете в виду под «просматривать веб-страницы», но Firefox использует собственный преобразователь-https://developers.cloudflare.com/1.1.1.1/commitment-to-privacy/privacy-policy/firefox/

Практически любое приложение может игнорировать ваши настройки DNS и использовать свой собственный преобразователь. Так что тот факт, что у вас нет правильной настройки DNS, их не остановит.

0
09.07.2020, 20:23
2 ответа

Для этого ответа я использовал следующие инструменты:

  • Баш
  • comm
  • find
  • xargs

Я рекомендую вам использовать версию GNU последних 3 утилит, так как они могут работать с записями с разделителями NUL -.

Во-первых, давайте объявим некоторые переменные. Необходимо использовать абсолютные пути во всех этих переменных, так как мы будем менять каталоги много раз :

.
# The directories that will be compared
original_dir='/path/to/original/directory'
copy_dir='/path/to/copy/directory'

# Text files where we will save the structure of both directories
original_structure="${HOME}/original_structure.txt"
copy_structure="${HOME}/copy_structure.txt"

# Text files where we will separate each subdirectory
# depending on the action we will perform on them
dirs_to_add="${HOME}/dirs_to_add.txt"
dirs_to_remove="${HOME}/dirs_to_remove.txt"

Сохранить текущую структуру обоих каталогов:

cd -- "${original_dir}"
find. \! -name '.' -type 'd' -print0 | sort -z > "${original_structure}"

cd -- "${copy_dir}"
find. \! -name '.' -type 'd' -print0 | sort -z > "${copy_structure}"

Сохранение различий между обеими структурами:

comm -23 -z -- "${original_structure}" "${copy_structure}" > "${dirs_to_add}"
comm -13 -z -- "${original_structure}" "${copy_structure}" > "${dirs_to_remove}"

Создайте недостающие каталоги:

cd -- "${copy_dir}"
xargs -0 mkdir -p -- < "${dirs_to_add}"

Удалите ненужные каталоги:

cd -- "${copy_dir}"
xargs -0 rm -rf -- < "${dirs_to_remove}"

Удалите созданные нами текстовые файлы для сохранения временной информации:

rm -- "${original_structure}" "${copy_structure}"
rm -- "${dirs_to_add}" "${dirs_to_remove}"

Примечания

  • Этот метод только копирует структуру. Он не сохраняет владельцев, разрешения или атрибуты. Я читал, что некоторые другие инструменты, такие как rsync, могут их сохранить, но у меня нет опыта их использования.

  • Если вы хотите поместить приведенный выше код в скрипт, убедитесь, что реализована обработка ошибок. Например, неудачный вход cdв каталог и работа в неправильном каталоге может привести к катастрофическим последствиям.

0
18.03.2021, 23:20

Что-то вроде этой функции оболочки:

comparedirs() (
    cd -- "${1?}";
    for d in */; do
        ! [ -d../"${2?}"/"$d" ] && printf "%s\n" "$d is in '$1' but not in '$2'"
    done
)

Испытание:

$ mkdir -p left/{a,b,c}
$ mkdir -p right/{a,c,d}
$ comparedirs left right
b/ is in 'left' but not in 'right'
$ comparedirs right left
d/ is in 'right' but not in 'left'

Заметьте, что просматриваются только подкаталоги, а не файлы; и предполагает, что каталоги действительно являются родственными, т.е. что вы можете получить доступ к одному из другого с помощью ../name.(Обобщение на другую ситуацию оставлено в качестве упражнения для следующего ответа.)

0
18.03.2021, 23:20

Теги

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