2012-02-21 1 views
7

Используя bash, как я могу найти файл с определенным именем где-нибудь в дереве каталогов из pwd?Найти файл по имени до дерева каталогов, используя bash

Чтобы быть более понятным. Я хочу найти файл, который находится в корне моей рабочей директории, но я не знаю, где находится корень, а мой pwd может быть где угодно ниже корня.

+0

Что значит, вы не знаете, где находится ваш корень? Можете ли вы привести краткий пример того, как выглядит дерево каталогов? Каков ваш текущий рабочий каталог и где вы хотите искать файлы? Как правило, для поиска везде, вы можете запустить 'find/-name ' как пользователь root. –

ответ

11

Найти file.txt до укоренить

$ x=`pwd`; while [ "$x" != "/" ] ; do x=`dirname "$x"`; find "$x" -maxdepth 1 -name file.txt; done 
+1

Отличный материал @kev. Я просто добавил разрыв в цикл: '' x = 'pwd'; while ["$ x"! = "/"]; do x = 'dirname" $ ​​x "'; echo "$ x"; если ['find" $ x "-maxdepth 1 -name erm.properties']; затем перерыв; Fi; done'' –

+0

Это, похоже, не работает для меня. Он просто продолжает делать это снова и снова навсегда. X идет от текущего пути к «/», но после этого он только начинается. – trans

+0

Ничего. Моя проблема связана с созданием псевдонима и последующим вызовом псевдонима в псевдониме. – trans

2

У меня есть следующие функции, определенной в моем ~/.bashrc:

dnif() { 
    # Recursively list a file from PWD up the directory tree to root 
    [[ -n $1 ]] || { echo "dnif [ls-opts] name"; return 1; } 
    local THERE=$PWD RC=2 
    while [[ $THERE !=/]] 
     do [[ -e $THERE/${2:-$1} ]] && { ls ${2:+$1} $THERE/${2:-$1}; RC=0; } 
      THERE=$(dirname $THERE) 
     done 
    [[ -e $THERE/${2:-$1} ]] && { ls ${2:+$1} /${2:-$1}; RC=0; } 
    return $RC 
} 

, который будет искать имя вы предоставляете в качестве параметра в каждой директории вверх от текущего до корня, и если он найден, перечислите его с помощью «ls» и дополнительных опций ls -options, которые вы предоставляете. Пример вывода:

[email protected]:~/dev/example 
$ dnif; echo $? 
dnif [ls-opts] name 
1 
[email protected]:~/dev/example 
$ dnif -alp nonesuch; echo $? 
2 
[email protected]:~/dev/example 
$ dnif -alp .bashrc; echo $? 
-rw-r--r-- 1 me mine 3486 Apr 3 2012 /home/me/.bashrc 
0 
[email protected]:~/dev/example 
$ dnif -d . 
/home/me/dev/example/. 
/home/me/dev/. 
/home/me/. 
/home/. 
/. 

Обратите внимание:

  • "dnif" является "найти" в обратном направлении.
  • Функция представляет собой конечный цикл (не рекурсивный), не создает подоболочек и использует встроенные функции Bash как можно больше для скорости.
  • В списке отображаются все образы на каждом возрастающем уровне каталогов.
  • ls -opts необязательны, но должны предшествовать требуемому аргументу поиска.
  • Аргумент поиска может быть файлом или каталогом.
  • Если аргумент поиска является каталогом, включите ls -opt '-d', чтобы ограничить результаты именами каталогов, а не содержимым.
  • Функция возвращает код выхода
    • 0, если есть хотя бы один хит,
    • 1, если параметры не предназначены для помощи, и
    • 2, если ничего не найдено.
Смежные вопросы