Почему `находит -тип d -exec rmdir {} \; `команда выдает сообщение «Нет такого файла или каталога»

trueи false— это команды, которые завершаются с кодами успешного и неудачного завершения соответственно. Они не заставляют вашу функцию возвращать эти значения, для этого используйте команду returnи целочисленные значения, соответствующие успеху (0 )или сбою (что-либо отличное от 0 ). Кроме того, я почти уверен, что вы не хотите возвращать отказ для первой строки, которая не соответствует, только если нет строки, совпавшей:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    while read line; do
        if [ "$line" == "$funkx" ]
        then
            return 0    # 0 = success ("true"); break is not needed because return exits the function
        fi
    done < $file
    # If a line matched, it won't get here (it will have returned out of the middle
    # of the loop). Therefore, if it gets here, there must not have been a match.
    return 1    # 1 = failure ("false")
}

Но есть гораздо более простой способ сделать это. Используйте grep--, его работа заключается в поиске в файлах совпадающих строк. Вы хотитеgrep -Fxq---Fозначает поиск фиксированных строк (не шаблонов регулярных выражений ), -xозначает, что требуется совпадение всей строки, а не только ее части, а -qозначает, что не нужно печатать результат, просто выйдите со статусом успеха, если совпадение было найдено, в противном случае произойдет сбой. И даже не нужна явная команда return, так как функция будет неявно возвращать статус последней команды в ней:

check(){
    file=/root/Turkiye.txt
    local funkx=$1
    grep -Fxq "$funkx" "$file"
}

Или еще проще:

check(){
    grep -Fxq "$1" /root/Turkiye.txt
}
1
31.05.2019, 18:09
1 ответ

Предположительно происходит то, что с конструкцией -exec... \;find делает свою работу шаг за шагом:

  • пройтись по дереву каталогов, найдя записи, соответствующие -type dи
  • запустить rmdirдля таких записей, как только они будут найдены.

Это означает, что в вашем примере find будет смотреть на dir01, сохраните его иметь в виду как каталог, чтобы войти позже, затем запустить rmdirна нем, и затем, при попытке рекурсии в dir01, потерпеть неудачу, потому что это не существуют больше.

Запуск с -exec rmdir {} +должен помочь в этом случае :будет отправлен вызов rmdir dir01 dir02 dir03. Это избавляет от последние три сообщения об ошибках.

Сообщение об ошибке .связано с тем, что .текущий каталог действительно является каталогом, но не тем, который rmdirможет удалить, потому что он не пустой. Используйте -min-depth, чтобы перестать думать об этом, выполнение команды:

find -mindepth 1 -type d -exec rmdir {} +

Это несовершенно; вложенные каталоги или большое количество совпадающих каталоги могут по-прежнему вызывать вывод сообщений об ошибках, но это должно работать в простом случае из вопроса.

1
27.01.2020, 23:22

Теги

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