найти, существуют ли файлы в одном каталоге рекурсивно в другом каталоге рекурсивно в linux bash и вывести существует или не существует

найти, существуют ли файлы в одном каталоге рекурсивно в другом каталоге рекурсивно в linux bash и вывести существует или не существует

найти, существуют ли файлы в одном каталоге рекурсивно в другом каталоге рекурсивно в linux bash и вывести существует или не существует

допустим у вас есть

  • pth1/dirA/file1 pth1/dirA/DirB/file2 и
  • pth2/dirA/file1 pth2/dirA/DirB/file3

Мне нужен отчет, который

file1 exists 
files2 dont exist in pth2
files3 dont exist in pth1

Я нашел код, который работает для текущего уровня в обоих каталогах, но я не могу заставить его работать рекурсивно.взято отсюда

pth1="/mntA/newpics";
pth2="/mntB/oldpics";
for file in "${pth1}"/*; do
    if [[ -f "${pth2}/${file##*/}" ]]; then
       echo "$file exists";
    fi
done

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

решение1

Я сделал это другим методом. Я нахожу все файлы в одном каталоге, удаляю их путь, затем я могу сохранить результаты в двух разных файлах и сравнить их с помощью meld или другой программы, или я могу сравнить результаты напрямую с помощью meld.

Обратите внимание, что я сортирую файлы и выбираю только уникальные файлы, а не дубликаты в результатах. Также меня интересуют только файлы, имя которых заканчивается расширением "jpg".

pth1="/mnt/oldfiles";
pth2="/mnt/newfiles";

а потом

(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq )  > a.txt;
(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq )  > b.txt;
meld a.txt b.txt

ИЛИ напрямую

meld <(find "${pth1}"/ -exec basename {} \; | grep "jpg$" | sort | uniq )  <(find "${pth2}"/ -exec basename {} \; | grep "jpg$" | sort | uniq )

ОБНОВЛЕНИЕ: если один каталог намного больше другого, прямая команда не работает (MILD открывается без завершения обеих команд).

решение2

Не совсем понятно, чего вы хотите, но я думаю, что это сработает. Эта команда сравнивает все файлы в с /path/1теми, что в /path/2, проверяя на существование и равенство.

diff --brief --recursive /path/1 /path/2

Рабочий пример

# Create some files
mkdir -p 1/{x,y} 2/{x,z}
touch 1/{x,y}/file1
date | tee 2/x/file1 >2/z/date

# Show what we have
tree 1 2
1
├── x
│   └── file1
└── y
    └── file1
2
├── x
│   └── file1
└── z
    └── date
4 directories, 4 files

# Compare the two directory trees
diff --brief --recursive 1 2
Files 1/x/file1 and 2/x/file1 differ
Only in 1: y
Only in 2: z

Связанный контент