Как исключить один конкретный файл из хэша через сценарий bash

Или, альтернативно, снимки Debian, которые Elazar опубликовал в своем ответе, вы можете использовать репозитории пакетов Ubuntu для более старых версий Ubuntu: http://packages.ubuntu.com

Добавьте их в /etc/apt/sources.list, как уже писал Элазар:

deb     http://archive.ubuntu.com/ubuntu/ hardy universe
deb-src http://archive.ubuntu.com/ubuntu/ hardy universe

Репозиторий Hardy Universe - это тот, который содержит gcc-3.4.

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

5 ответов

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

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

вызывать скрипт с помощью ./script "md5checksums"

3
ответ дан 23 May 2018 в 12:15
  • 1
    То, что я искал :) изменил мою линию до find -type f ! -iname "md5checksums" -exec md5sum "{}" + > md5checksums, и теперь она работает как ветер, спасибо – Videonauth 10 April 2016 в 23:24
  • 2
    почему -iname вместо -name? почему даже есть это как аргумент, когда имя файла - md5checksums? – tlund 10 April 2016 в 23:27
  • 3
    Вы пропустили маленький !, что означает, что он также не равен -not -name. Но, честно говоря, я чувствую себя смущенным, что я не смог наткнуться на это простое решение самостоятельно. – Videonauth 10 April 2016 в 23:31
  • 4
    @tlund: Я помещал -iname вместо -name на всякий случай, когда он называет скрипт с именем файла во всех шапках или что-то в этом роде. но поскольку он предпочитает, чтобы имя файла было жестко закодировано в скрипте, это не имеет значения :) Я сделал сценарий, беря имя файла в качестве аргумента, если имя файла было чем-то несовместимым каждый раз, когда он называет свой хэш-скрипт. – user 10 April 2016 в 23:35

Самый простой способ избежать конфликтов, связанных с перенаправлением на файл, влияющий на команду, заключается в использовании sponge from 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.

Эффект заключается в том, что файл, если он еще не указан, isn созданный до тех пор, пока трубопровод не завершится. Итак:

find . -type f -exec md5sum {} + | sponge md5checksums
2
ответ дан 23 May 2018 в 12:15

Использование только 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 расширенным шаблоном glob, что означает для соответствия всем остальным, кроме md5checksums. Квалификатор glob (.) ограничивает соответствие только обычным файлам.
2
ответ дан 23 May 2018 в 12:15

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

#!/bin/bash
rm -f md5checksums
find -type f -not -name "md5checksums" -exec md5sum "{}" + > md5checksums
1
ответ дан 23 May 2018 в 12:15

Спасибо @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
ответ дан 23 May 2018 в 12:15

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

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