Различие вывода команды find между двумя серверами SuseLinux

Вопрос или проблема

У меня есть два сервера Suse 15.6, оба имеют одни и те же каталоги и файлы; первый пример работает на виртуальной машине GCP, а другой на виртуальной машине VMWare.

Не уверен, какую переменную окружения я упускаю, поскольку оба имеют declare -x LANG="en_US.UTF-8" и declare -x LS_OPTIONS="-A -N --color=tty -T 0" (не уверен, влияет ли это каким-то образом на вывод find)

Оба сервера используют find (GNU findutils) 4.8.0

Мне нужно перенаправить вывод в файл, чтобы я мог их сравнить, но по какой-то причине один из них сначала показывает файлы с точкой, а другой начинает с папки jre.

# find . -type f | less
./.install4j/user/commons-codec.jar
./.install4j/user/commons-httpclient.jar
./.install4j/user/commons-io.jar
./.install4j/user/dom4j.jar
./.install4j/user/flatlaf.jar
./.install4j/user/inception.jar
./.install4j/user/modzdetector.jar
./.install4j/user/slf4j-api.jar
./.install4j/user/slf4j-jdk14.jar
./.install4j/MessagesDefault
./.install4j/files.log
./.install4j/i4j_extf_0_4r1oza.utf8
./.install4j/i4j_extf_1_4r1oza.utf8
./.install4j/i4j_extf_2_4r1oza_1pb4rjn.png
./.install4j/i4j_extf_3_4r1oza_1wyvt5o.png
./.install4j/i4j_extf_4_4r1oza_10elu9m.png
./.install4j/i4j_extf_5_4r1oza_18gg8kx.png
./.install4j/[email protected]
./.install4j/i4j_extf_5_4r1oza_18gg8kx@2x_dark.png
./.install4j/i4j_extf_5_4r1oza_18gg8kx_dark.png
./.install4j/i4j_extf_6_4r1oza_deir7z.png
./.install4j/i4jempty.ttf
./.install4j/i4jparams.conf
./.install4j/i4jruntime.jar
./.install4j/inst_jre.cfg
./.install4j/install.prop
./.install4j/installation.id
./.install4j/installation.log
./.install4j/launcher0.jar
./.install4j/launcher2bfa42ba.jar
./.install4j/libi4jinst.dylib
./.install4j/libi4jinst2.dylib
./.install4j/pref_jre.cfg
./.install4j/response.varfile
find . -type f | less
./jre/bin/rmiregistry
./jre/bin/keytool
./jre/bin/jrunscript
./jre/bin/jfr
./jre/bin/java
./jre/conf/sound.properties
./jre/conf/sdp/sdp.conf.template
./jre/conf/security/policy/unlimited/default_local.policy
./jre/conf/security/policy/unlimited/default_US_export.policy
./jre/conf/security/policy/README.txt
./jre/conf/security/policy/limited/default_local.policy
./jre/conf/security/policy/limited/default_US_export.policy
./jre/conf/security/policy/limited/exempt_local.policy
./jre/conf/security/java.security
./jre/conf/security/java.policy
./jre/conf/net.properties
./jre/conf/logging.properties
./jre/conf/management/jmxremote.password.template
./jre/conf/management/management.properties
./jre/conf/management/jmxremote.access
./jre/legal/java.xml.crypto/santuario.md
./jre/legal/jdk.dynalink/dynalink.md
./jre/legal/java.base/aes.md
./jre/legal/java.base/public_suffix.md
./jre/legal/java.base/ASSEMBLY_EXCEPTION
./jre/legal/java.base/LICENSE
./jre/legal/java.base/icu.md
./jre/legal/java.base/unicode.md
./jre/legal/java.base/c-libutl.md
./jre/legal/java.base/asm.md
./jre/legal/java.base/cldr.md
./jre/legal/java.base/ADDITIONAL_LICENSE_INFO
lines 1-32

find обычно выводит записи директории как только они находятся, не упорядочивая их каким-либо образом. Обычный способ сравнения таких списков файлов — это их сортировка

LC_ALL=C comm <( cd /dir1 && find . -type f | LC_ALL=C sort ) <( cd /dir2 && find . -type f | LC_ALL=C sort ) 

.

Ответ или решение

Для понимания различий в выводе команды find на двух серверах SUSE Linux 15.6 необходимо учесть несколько технических аспектов, которые могут влиять на порядок отображения файлов. Это могут быть системные переменные среды, различия в настройках файловой системы, а также уникальные особенности самих виртуальных машин, на которых работают данные серверы.

Теория

Команда find в UNIX-подобных системах, включая Linux, используется для поиска файлов и директорий. Она ориентируется на файл, откуда начала искать файлы, и не применяет какую-либо сортировку по умолчанию. Порядок вывода файлов определяется порядком их расположения в файловой системе. Таким образом, вывод команды может отличаться на двух системах просто из-за различий в системном расположении файлов, даже если файлы идентичны по содержимому.

Существуют несколько факторов, которые могут повлиять на порядок вывода:

  1. Файловая система: Различные файлы и папки могут быть физически расположены по-разному в файловых системах между двумя виртуальными машинами. Это особенно актуально, если системы созданы в различное время или с использованием разных параметров форматирования.

  2. Кэш и буферизация: Различные состояния кэша и системной буферизации могут также изменить порядок, в котором файлы появляются. Это, однако, маловероятно при столь простом использовании find.

  3. Версия программного обеспечения и конфигурации: Хотя упоминается, что обе системы используют find (GNU findutils) 4.8.0, не исключено наличие патчей или отличий в компиляции.

  4. Среда выполнения: Переменные среды, такие как LANG и LS_OPTIONS, как правило, напрямую не влияют на команду find, однако они могут определить формат и стиль вывода для других команд, таких как ls.

Пример

Как видно из приведенного примера, find возвращает файлы с точкой (скрытые) в самом начале в одном случае, тогда как в другом начинается с каталога jre. Причина может быть в том, что файловая система упорядочивает записи неоднозначно. Обычно разные системы могут по-разному обрабатывать скрытые и открытые файлы, если используется нестандартный способ индексирования файлов.

Применение

Для корректного инициализации сравнения нужно отсортировать вывод команд, и для этого идеально подойдет команда sort. Она обеспечит консистентный алфавитный порядок имени файла. Вы можете использовать такую команду, чтобы сравнить два вывода:

LC_ALL=C comm <(cd /path/to/first/dir && find . -type f | LC_ALL=C sort) <(cd /path/to/second/dir && find . -type f | LC_ALL=C sort)

В этой команде LC_ALL=C используется для установки одинаковой локальности и гарантирует, что сортировка будет выполнена в одинаковом порядке на обоих серверах.

Таким образом, данные технические меры помогут выявить не только разницу в файловых данных, но и устранить вариации, связанные с внутренними обработками файловых систем. Использование лексикографической сортировки позволит изолировать элементарные различия, связанные с системой хранения, и фокусироваться на отличиях, связанных непосредственно с содержимым.

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

Оцените материал
Добавить комментарий

Капча загружается...