Какие флаги мне нужно дать команде find для входа в каталог перед запуском команды -exec ?

У меня есть каталог, заполненный каталогами, заполненными файлами

> root directory
 -> directory1
  -> file1
  -> file2...
 -> directory2
  ->file1
  ->file2
 -> directory...

и я хочу разместить файл контрольной суммы в каждом каталоге, который содержит суммы содержимого каталога:

> root directory
 -> directory1
  -> file1
  -> file2...
  -> checksums.md5
 -> directory2
  ->file1
  ->file2
  -> checksums.md5
 -> directory...

Я возился по линиям

find . -type f -name '*' -exec md5sum {} >> checksums.md5 \;

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

То, что я пытаюсь сделать, это MD5 содержимое каждой папки и поместить в нее файл контрольной суммы, затем перейти к следующей папке и повторить.

Содержимое файла checkums.md5 также желательно сортировать.

3 ответа3

0

Вам необходимо выполнить добавление в файл.

find ... -execdir bash -c 'md5sum "{}" >> checksum.md5' \;
0

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

Обход к каждому каталогу

Итак, в написанной вами команде в текущем каталоге был создан файл checksum.md5 (он был для вас root). Чтобы создать файл контрольной суммы в каждом подкаталоге, вы должны пройти туда, выполнить команду, а затем вернуться в текущий каталог. Не совсем так, как-то так:

cd directory1; md5sum * >> checksum.md5 ; cd ..;

Использование find в Loop

Итак, я просто использовал строки, которые вы использовали, и поместил их в цикл, который перебирает все подкаталоги, присутствующие в текущем каталоге. Вот что я сделал:

for i in $( ls -d */ );
  do cd $i && find . -type f -name '*' -exec md5sum {} >> checksum_files.md5 \; && cd ..;
  done; 

Что это делает:

  • $i содержит список каталогов, по которым проходит цикл.
  • cd $i меняет текущий каталог на некоторый подкаталог в списке.
  • Затем find команду, которую вы уже написали.
  • cd .. Перейдите обратно к текущему каталогу (в данном случае root).
  • Я использовал && между cd и find чтобы явно поставить условие, что если он попадает только в подкаталог, то выполняю команду find.

Одна строка для копирования-вставки

for i in $( ls -d */ ); do cd $i && find . -type f -name '*' -exec md5sum {} >> checksum_files.md5 \; && cd ..; done; 

Я думаю, что у этого решения есть возможности для улучшения, и любые такие приветствуются. Не стесняйтесь добавлять дополнительные детали.

0

Чтобы создать ответ Игнасио Васкеса-Абрамса, я сделал следующую функцию bash, которая сканирует подкаталоги MD5 с содержимым, помещает файл MD5 в подкаталог, а затем выполняет пост-обработку файлов контрольной суммы, чтобы отсортировать их так, чтобы полученные контрольные суммы были в порядке следования. на имя файла:

function md5dirs () {
  find . -type f -name '*' -execdir bash -c 'md5sum "{}" >> checksums.md5' \;
  find . -type f -name 'checksums.md5' -execdir bash -c 'sort -k 2 "{}" -o checksums.md5' \;
}

Изменение первого параметра find -name для включения расширений с подстановочными знаками, таких как *.jpg приведет к тому, что команда find найдет только определенные MD5 файлы в каталогах. По умолчанию с * он хэширует все файлы в каталоге.

Возможно, для первого параметра лучше указать параметр -name первого параметра find -name , но большинство людей будут хэшировать все содержимое папки, а не только подмножество файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .