«Файл B с именами файлов» минус/без «файл A с именами файлов», иначе «что было удалено в A»?

Метод

используется в дистрибутивах на основе Debian -. В Fedora вы можете использовать или .

Попробуйте:

dnf install pure-ftpd

0
02.01.2021, 20:17
2 ответа

Для списочных конъюнкций/вычитаний стандартной командой является comm. Он работает со строками отсортированных файлов.

Итак, для строк B_files.txt, которых нет вA_files.txt:

export LC_ALL=C # for a simple and deterministic order and allow any byte
                # in file names.
comm -23 <(sort A_files.txt) <(sort B_files.txt)

Если файлы уже отсортированы:

comm -23 A_files.txt B_files.txt

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

Если вы работаете в системе GNU, вы можете использовать записи с разделителями NUL вместо строк и использовать опцию -zдля sortи comm.

Другой подход заключается в использовании операторов объединения/вычитания массива zsh:

cd /path/to/A || exit
A_regular_files=(**/*(ND.))
cd /path/to/B || exit
B_regular_files=(**/*(ND.))

files_in_B_but_not_in_A=(${B_regular_files:|A_regular_files})

Также обратите внимание, что если не передана опция -x, grepсоответствует подстроке. Например, grep -F foo/barсовпадает с blah/foo/barrage.

3
18.03.2021, 22:38

Я придумал:

MY_SOURCE=A_files.txt
readarray -t MY_TARGET_ARRAY < B_files.txt
for LINE in "${MY_TARGET_ARRAY[@]}"; do
    if ! grep -q "${LINE}" "${MY_SOURCE}"; then
        echo "${LINE}";
    fi;
done

Еще не тестировалось. Возможно проблемы с отсутствием -xи/или отсутствием -Fв grep.

0
18.03.2021, 22:38

Теги

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