2015-06-29 4 views
0

Использование сценариев bash, я ищу, чтобы попытаться найти файл, основанный на пути, однако я бы хотел поискать со дна пути вверх. что-то вроде/path/to/directory/here, а затем ищите «здесь» для файла «.important», затем перейдите в «каталог» и найдите «.important» и так далее дерево. Я не хочу спускать нисходящую точку на пути. Thanksпоиск файлов по пути внизу вверх bash

ответ

1

Простой, как только вы понимаете манипуляции строк в bash.

dest=/path/to/directory/here 
curr= 

# quote right-hand side to prevent interpretation as glob-style pattern 
while [[ $curr != "$dest" ]]; do 
    if [[ -e $curr/.important ]]; then 
    printf 'Found ' >&2 
    printf '%s\n' "$curr/.important" 
    else 
    printf '%s\n' "Not found at $curr" >&2 
    fi 
    rest=${dest#$curr/} # strip $curr/ from $dest to get $rest 
    next=${rest%%/*}  # strip anything after the first/from next 
    [[ $next ]] || break # break if next is empty 
    curr=$curr/$next  # otherwise, add next to curr and recur 
done 

См. http://wiki.bash-hackers.org/syntax/pe для получения дополнительной информации о синтаксисе расширения строки, используемом здесь.


Поочередно:

(set -f; cd /; IFS=/; for dir in $dest; do 
    cd "$dir" || break 
    if [ -e .important ]; then 
     pwd 
     break 
    fi 
    done) 

Ключевые моменты:

  • set -f отключает подстановку; в противном случае это будет очень плохо для каталога с именем *.
  • IFS=/ устанавливает разделение струн на расширение для работы на /.
  • for dir in $destбезопасен только после выполнения двух вышеуказанных операций.
  • break ИНГ если cd терпит неудачу имеет важное значение для обеспечения того, чтобы ваш сценарий на самом деле в каталоге, что он думает, что это в.

Обратите внимание, что это делается в субоболочке (в скобках), чтобы предотвратить его изменения к настройкам оболочки (set -f и IFS=) от воздействия на большой скрипт. Это означает, что вы можете использовать его в $() и читать его вывод через stdout в переменную оболочки, но вы не можете установить переменную внутри нее и ожидать, что эта переменная все еще будет установлена ​​в родительском скрипте.

+0

Это сработало отлично! Спасибо! – CainKnightWind

Смежные вопросы