Как исключить хеширование одного конкретного файла через скрипт bash

Я на самом деле пытаюсь запустить рекурсивную структуру папок и сделать md5sum для всех файлов в одном файле md5checksums.

Вот мой сценарий:

#!/bin/bash
rm -f md5checksums
find -type f -exec md5sum "{}" + > md5checksums

Моя проблема сейчас в том, что файл md5checksums также работает через md5sum, и я не могу понять, как это предотвратить. Кроме того, скрипт уже делает то, что должен делать. Кто-нибудь, кто может мне помочь?

3
задан 10 April 2016 в 22:59

5 ответов

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

#!/bin/bash
rm -f md5checksums
find -type f ! -iname "$1" -exec md5sum "{}" + > md5checksums

называют сценарий с ./script "md5checksums"

3
ответ дан 11 April 2016 в 08:59
  • 1
    Я изменил имя Wi-Fi на VINEET101 и это все еще didn' t делают что-либо – vineet sinha 21 August 2017 в 15:23

Самый простой способ избежать конфликтов, включающих перенаправления в файл, влияющий на команду, состоял бы в том, чтобы использовать 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
2
ответ дан 11 April 2016 в 08:59
  • 1
    Хорошо, поэтому как я могу проверить соответствующую библиотеку на 32-разрядную систему, для проверки. – commonSense 20 August 2017 в 16:04

Используя только 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

  • Спецификатор шарика (.) ограничивает соответствия регулярными файлами только.

2
ответ дан 11 April 2016 в 08:59

Другой, которые делают то, что Вы хотите:

#!/bin/bash
rm -f md5checksums
find -type f -not -name "md5checksums" -exec md5sum "{}" + > md5checksums
1
ответ дан 11 April 2016 в 08:59

Благодаря @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
1
ответ дан 11 April 2016 в 08:59
  • 1
    Хм. В то время как этот isn' t случай с моей ситуацией это - лучший ответ в общем случае.Спасибо! – McLemore 24 August 2017 в 04:18

Другие вопросы по тегам:

Похожие вопросы: