Команда find работает в терминале, но не в bash-скрипте - PullRequest
3 голосов
/ 15 июня 2019

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

Я пытался экранировать свои переменные, заключать их в кавычки, такие как $() или ${}, но ничего не получалось.

Мой код поиска выглядит так:

find ${StartDirs[*]} $pat -print

Фактически это будет выполнено как:

find ./bin  -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print

Второй код выше работает в терминале, но не в скрипте. Что я сделал не так?

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

StartDirs=();
ExcludedFiles=(); #files/directories which needs to be excluded

#check and store excluded files
CheckExcludedFile(){ #this function will be called over and over again by another function (getopts). It depends on the chain of -x options. With the -x option I can decide which file i want to exclude. The Getopts function is also omitted.

    exclFile=`find $1 2>/dev/null | wc -l` 
    if [ $exclFile -lt 1 ]; then
        echo $FILEMAPNOTEXIST | sed 's~-~'$1'~g' # FILEMAPNOTEXIST is a variable from another script with error messages
        exit 0
    else
        ExcludedFiles+=($1) #add excluded file/dir path to array
    fi
}

MakeBackup(){
        for i in ${ExcludedFiles[*]}
        do
            s=" -wholename $i -prune -o"
            pat=$pat$s
        done
        # the code above edits the array elements of the EcludedFIles[]
        #For example by calling the script with the -x option (-x fileA -x fileB -x fileC) wordt als volgt: -wholename 'fileA' -prune -o -wholename 'fileB' -prune -o -wholename 'fileC' -prune -o.
        #the pat variable will be used for the find command to ignore files/directories

    mkdir -p ~/var

    echo "Start-time $(date '+%F %T')" >> ~/var/dq.log  

    find ./bin  -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print
    #the code above should work like in terminal. That is not the case..

    # find ${StartDirs[*]} $pat -print #this should work also.

    # cp -av ${StartDirs[@]} $Destination >> ~/var/dq.log find command not working therefore this rule is commented

    echo "end-time $(date '+%F %T')" >> ~/var/dq.log
}

Ожидаемый результат должен состоять в том, что некоторые файлы / каталоги должны быть исключены, если даны.

Если необходим полный скрипт, дайте мне знать.

1 Ответ

2 голосов
/ 15 июня 2019

Команда find ./bin -wholename './bin/backup2' -prune -o -wholename './bin/backup3' -prune -o -print должна работать как задумано, , если текущий каталог находится прямо над bin/. Это может быть причиной ваших проблем: Если в реальном скрипте вы собираете пути, которые выполняют не совпадают с префиксами в найденных путях, например, чернослив не будет работать. Пример: у вас есть каталог /home/me; в нем bin/backup2/, bin/backup3/ и stuff-to-backup/. Теперь, если вы находитесь в /home/me и выполняете find ., он находит, например, ./bin/backup2 который будет обрезан.

Но если вы поместите это в скрипт и вызовете скрипт с аргументами пути, например, /home/me, он найдет те же файлы, но пути будут другими, например, /home/me/bin/backup2 и не удалит его, потому что он не соответствует предоставленному шаблону исключения, , даже если это одни и те же файлы. Аналогично, не будет найдено ни одного шаблона, поставляемого с -wholename. Здесь - вопрос, который решает эту проблему.

...