
найти, существуют ли файлы в одном каталоге рекурсивно в другом каталоге рекурсивно в 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