Ответ 1
Я бы адаптировал ответ по @user1464130, так как у него проблемы с обработкой пробелов в именах файлов.
cd dir1
find . -type f -printf "%p %s\n" | sort > ~/dir1.txt
cd dir2
find . -type f -printf "%p %s\n" | sort > ~/dir2.txt
diff ~/dir1.txt ~/dir2.txt
Если вы хотите запустить команду для каждого файла и использовать результат в отчете, вы можете использовать конструкцию while
Bash. В этом примере md5sum
используется для вычисления контрольной суммы для каждого файла.
find . -maxdepth 1 -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done
Каждый $()
выполняется отдельно и позволяет нам вычислить контрольную сумму для каждого файла. Использование tr
сжимает все последовательные пробелы в один пробел и cut
извлечение слова в n-й позиции, здесь в первой позиции. Если мы этого не сделаем, мы получим имя файла два раза, потому что md5sum
вернет его на стандартный вывод.
Вот пример без использования сравнения (без diff
). Обратите внимание, что я использовал тире -
для выделения трех данных, которые мы выводим для каждого файла, но это может быть проблемой, если вы хотите передать его в другую программу.
$ find . -maxdepth 1 -name "*.c" -type f -printf "%p %s\n" | while read path size; do echo "$path - $(md5sum $path | tr -s " " | cut -f 1 -d " ") - $size" ; done
./thread.c - 5f2b7b12c7cd12fcb9e9796078e5d15b - 584
./utils.c - d61bc1dbc72768e622a04f03e3b8f7a2 - 3413
РЕДАКТИРОВАТЬ: И для обработки пробелов в именах файлов и по-прежнему получить контрольную сумму и размер, вы можете использовать следующий код.
$ find . -maxdepth 1 -name "*.c" -type f -print0 | xargs -0 -n 1 md5sum | while read checksum path; do echo $path $(stat --printf="%s" "$path") $checksum ; done
./ini tia li za tion.c 84 31626123e9056bac2e96b472bd62f309