LINUX.ORG.RU

Получить количество совпадений файлов между двумя каталогами

 


1

2

Есть у меня каталог с локальным результатом и каталог с базой. Мне нужно узнать, сколько файлов в локальном результате совпали с файлами в базе. Т.е. например в базе:

base$ find ./
./
./01e5f3d9ec4660834ca25a41ce0ae7b0.png
./2aff9b954a4fadfd4eada57028f457a6.png
./2d2976c579c9c89712d772eab004831d.png
./49effd2f862e33a98a19d5328cccdd74.png
./749c34aadaa0351fb9a1283f56660b0f.png
./8c01446a22d826f0b9b05ca9b3938118.png
./e3659b0cd189fbf8777eab8533fc378d.png

А в локальном результате:

local$ find ./
./
./8c01446a22d826f0b9b05ca9b3938118.png <-- Совпал с базой
./e3659b0cd189fbf8777eab8533fc378d.png <-- Совпал с базой
./49eff82423bdbd32a102d5328cccdd74.png
В общем мне надо чтобы результатом команды стало 2.

Проверка на совпадение только по имени, файл уже назван по своему md5 хэшу. В голову идет только извращения с find ./base/ > file1 && find ./local/ >file2 а дальше разврат с diff. Как можно попроще?


У sha256sum удобный интерфейс, если не влом все пересчитать.

Пример: файл 2.txt правильный, 1.txt битый.


# Файлы на потестить
mkdir -p db local

echo 1 > db/1.txt
echo 2 > db/2.txt
echo 2 > local/1.txt
echo 2 > local/2.txt

# Сумма базы, пишем сразу в local
cd db
sha256sum -b * > ../local/sums.txt

cd ../local
# Просто распечатать результат
sha256sum -c sums.txt
# Число файлов
sha256sum -c --quiet sums.txt | wc -l

Вывод:

1.txt: FAILED
2.txt: OK
sha256sum: WARNING: 1 computed checksum did NOT match
sha256sum: WARNING: 1 computed checksum did NOT match
1
anonymous
()
#!/bin/bash

cd ~/find; fld_find=(*.png)
cd ~/local; fld_local=(*.png)
TOTAL=0

for ((i = ${#fld_find[@]} -1; i >=0; i--)); do
	for ((j = ${#fld_local[@]} -1; j >=0; j--)); do
		[[ ${fld_find[$i]} = ${fld_local[$j]} ]] && TOTAL=$(($TOTAL + 1))
	done
done
echo $TOTAL
ashot ★★★★
()
Ответ на: комментарий от ashot
import sys
import os

try:
    dir1, dir2 = sys.argv[1:]
except ValueError:
    raise SystemExit("Usage: {} <dir1> <dir2>".format(sys.argv[0]))

s1 = set(map(lambda x: x.name, os.scandir(dir1)))
s2 = set(map(lambda x: x.name, os.scandir(dir2)))

print(len(s1 & s2))
Smola
()

Можно ещё rmlint использовать.

Bfgeshka ★★★★★
()
cd local
find -mindepth 1 | grep -cFxf <(cd base && find -mindepth 1)

-mindepth 1 — для того, чтобы он не выводил ./.

anonymous
()
Ответ на: комментарий от FeyFre

И так тоже можно:

ls -1Q 'dir1' | xargs ls 'dir2' 1>true.txt 2>false.txt
anonymous
()
Ответ на: комментарий от ashot

Красиво.

Скорее кратко. Ну и я ошибся, :| — это оператор вычитания, а пересечение — это :*

salsa
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.