Я на самом деле пытаюсь запустить рекурсивную структуру папок и сделать md5sum для всех файлов в одном файле md5checksums.
Вот мой сценарий:
#!/bin/bash rm -f md5checksums find -type f -exec md5sum "{}" + > md5checksums
Моя проблема сейчас в том, что файл md5checksums также работает через md5sum, и я не могу понять, как это предотвратить. Кроме того, скрипт уже делает то, что должен делать. Кто-нибудь, кто может мне помочь?
заставьте сценарий взять название того определенный файл , который Вы хотите исключенный как аргумент.
#!/bin/bash
rm -f md5checksums
find -type f ! -iname "$1" -exec md5sum "{}" + > md5checksums
называют сценарий с ./script "md5checksums"
Самый простой способ избежать конфликтов, включающих перенаправления в файл, влияющий на команду, состоял бы в том, чтобы использовать sponge
от moreutils:
sponge reads standard input and writes it out to the specified file.
Unlike a shell redirect, sponge soaks up all its input before opening
the output file. This allows constructing pipelines that read from and
write to the same file.
эффект состоит в том, что файл, если не существующий уже, не создается, пока конвейер не заканчивается. Так:
find . -type f -exec md5sum {} + | sponge md5checksums
Используя только bash
:
Используя GLOBIGNORE
:
$ GLOBIGNORE='md5checksums' ## Pattern to ignore
$ shopt -s globstar ## Recursive globbing
$ { for i in **/*; do [ -f "$i" ] && md5sum "$i"; done ;} >md5checksums
Используя extglob
:
$ shopt -s extglob ## Enables extended pattern matching, enabled by default
$ shopt -s globstar
$ { for i in **/!(md5checksums); do [ -f "$i" ] && md5sum "$i"; done ;} >md5checksums
Используя zsh
:
% setopt extended_glob
% { for i in **/^md5checksums(.); do md5sum "$i"; done ;} >md5checksums
zsh
делает рекурсивное соответствие по умолчанию при использовании **
^md5checksums
zsh
расширенный шаблон шарика, означая соответствовать всему остальному кроме md5checksums
Спецификатор шарика (.)
ограничивает соответствия регулярными файлами только.
Другой, которые делают то, что Вы хотите:
#!/bin/bash
rm -f md5checksums
find -type f -not -name "md5checksums" -exec md5sum "{}" + > md5checksums
libc6-dev
(который you' ре, уже устанавливающее). В случае, если you' ре заинтересовало I' ve отправил более подробное объяснение .
– Eliah Kagan
22 August 2017 в 04:16
Благодаря @heemayl для некоторого хорошего вдохновения в его ответе.
#!/bin/bash
shopt -s globstar
rm -f md5checksums
for i in **/*; do
if [ ! -f "$i" -o "$i" = md5checksums -o "$i" = this_script.sh ]; then
continue
else
md5sum "$i" >> md5checksums
fi
done