@Drovosek01

Почему результат find в shell скрипте это текущая папка?

Есть shell скрипт который ищет бинарный файл и выполняет в нем поиск и замену байт.
Выполняется это в macOS Monterey.

spoiler
#!/bin/bash

set -x

declare -r dir=$( dirname "$0" )

declare -r -a plugs=(
    "Melodyne"
)

function replace() {
    declare -r -i count=$2
    declare -i c="$( perl -0777ne 'END {print $c} ++$c while /'$3'/gs' "$1" )"
    if [[ $c -ne $count ]]; then echo "Replace failed, found $c occurrences. Patch: $3"; return; fi
    sudo perl -0777pi -e 's|'$3'|'$4'|gs' "$1"
    return
}

function patchPlugins() {
    replace "$1" 1 '\x21\x02\x80\x52(.{4})\xF8\x03\x00\xAA\xE0\x1B\x40\xF9' '\x21\x02\x80\x52\x00\x00\x80\x52\xF8\x03\x00\xAA\xE0\x1B\x40\xF9'
    replace "$1" 1 '\xA8\x03\x5A\xF8\x1F\x20\x03\xD5' '\xA8\x03\x5A\xF8\x20\x00\x80\x52'
    replace "$1" 1 '\xFF\xFF\xBE\x11\x00\x00\x00(.{3})\x00\x00\x89\xC3\x48\x8B\xBD\x70\xFB\xFF\xFF\xE8' '\xFF\xFF\xBE\x11\x00\x00\x00\xB8\x00\x00\x00\x00\x89\xC3\x48\x8B\xBD\x70\xFB\xFF\xFF\xE8'
    replace "$1" 1 '\x31\xC0\x48\x8B\x0D(.{9})\x4D\xD0\x0F\x85\xFC\x00' '\xB0\x01\x48\x8B\x0D${1}\x4D\xD0\x0F\x85\xFC\x00'
}

echo "DIR $dir"

for plug in "${plugs[@]}"; do
    echo "PLUG $plug"
    find "$dir" -name "$plug"* -type d -maxdepth 3 -print | sort | while read dname; do
        echo "dname $dname"
        find "$dname" -name "$plug" -type f | grep "Contents/MacOS" | while read fname; do
            echo "Patching: $fname"
            sudo chown -R "$USER" "$dname"
            patchPlugins "$fname"
        done
    done
done

echo "Patching complete."


В ходе выполнения скрипта заметил, что в его выводе пишется, что определенные паттерны байт не найдены в файле
Replace failed, found 0 occurrences. Patch: \x01\x00\x80\x52\x9E\xA5\x79\x94\xF4\x03\x00\xAA
Replace failed, found 0 occurrences. Patch: \xC0\x03\x5F\xD6\xFC\x6F\xBA\xA9\xFA\x67\x01\xA9\xF8\x5F\x02\xA9\xF6\x57\x03\xA9\xF4\x4F\x04\xA9\xFD\x7B\x05\xA9\xFD\x43\x01\x91\xFF\x03\x07\xD1\xB7

Хотя я проверял вручную и эти шаблоны байт там есть.

Начал дебажить и выяснил, что первый find в цикле сначала выдает текущую папку, внутри которой должен производиться поиск,
/Users/USER/Desktop/Melodyne 5
а на следующей итерации уже находит необходимую вложенную
/Users/USER/Desktop/Melodyne 5/Melodyne.app

Вопросы:
1. Почему так происходит?
Если я правильно понимаю утилита find должна искать внутри указанной директории, а не брать указанную директорию за результат
2. Как можно исправить эту ситуацию (чтобы утилита find не использовала указанную для поиска директорию в качестве результата) не редактирую указанную для поиска диреторию?
Может быть есть какие-то параметры настройки поиска с помосщью find для такого случая?

P.S.
Вот архив со скриптом и подопытными "данными".
Я просто распаковываю на рабочий стол папку "Melodyne 5" и запускаю файл .command
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
так у вас же скрипт запускается не внутри Melodyne 5, а на рабочем столе, а для него Melodyne 5 это как раз первая папка подходящая под условие "Melodyne*"
Ответ написан
@Drovosek01 Автор вопроса
Если я вручную в терминале выполняю команду "find" то она не использует текущую директорию как результат поиска.
% cd /Users/user/Desktop/Melodyne\ 5 
% pwd
/Users/user/Desktop/Melodyne 5
% find "/Users/user/Desktop/Melodyne 5" -name "Melodyne"* -type d -maxdepth 3 -print | sort
/Users/user/Desktop/Melodyne 5/Melodyne.app

6512bebc13199518036140.png
Если такая же команда выполняется в скрипте - то она использует текущую директорию как результат поиска.

Почему так?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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