Я бы адаптировал ответ на @ 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
Однострочник найденных решений для соответствующего Unix StackExchange вопроса: http://unix.stackexchange.com/q/62140 – tanius