czy istnieje „do góry”?

7

Znalazłem, zapytałem to pytanie na złym miejscu wymiany stosu.

Aby znaleźć pliki zaczynające się od określonej ścieżki, mogę użyć find <path> .... Jeśli chcę znaleźć „w górę”, tj. W katalogu nadrzędnym i jest to rodzic, i… czy istnieje równoważne narzędzie?

Przypadek użycia to znajomość odpowiedniej liczby kropek (../../x.txt lub ../../../x.txt?) Do użycia np. plik makefile zawierający niektóre wspólne pliki makefile działa gdzieś w górę.

Przeznaczenie dla takiej struktury folderów:

/
/abc
/abc/dce/efg/ghi
/abc/dce/efg2


$ cd /abc/dce/efg/ghi
$ touch ../../x.txt
$ upfind . -name X*
../../x.txt
$ upfind . -name Y* || echo "not found"
not found
$ touch /abc/dce/efg2/x.txt
$ upfind . -name Y* || echo "not found"
not found
$ 

Krótko mówiąc:

  • powinien szukać w tym folderze, jest rodzicem, rodzicem rodzica ...
  • ale nie w żadnym z ich rodzeństwa (tak jak „znajdź”)
  • powinien zgłosić znalezione pliki względem bieżącej ścieżki
xtofl
źródło
Z linku, który już napisałeś, wynika, że ​​rozwiązałeś problem ...
Matt
@Matt: tak, ale zawsze staram się znaleźć jedną lepszą odpowiedź, a to jest lepsze forum.
xtofl
Ah. Właściwie uważałbym, że najlepszym forum byłoby TAK, prawda?
Matt
Możliwe tak samo na unix SE: unix.stackexchange.com/questions/6463/…
Ciro Santilli 新疆改造中心 六四事件 法轮功

Odpowiedzi:

1

Możesz po prostu podzielić ścieżkę na jej składowe węzły katalogu i wyszukiwać każdy dyskretnie. To jest bash scenariusz.

IFS=/; dn=($1); ct=${#dn[@]}
for((i=0; i<ct; i++)); do
  subd+=/"${dn[i]}"
  dots=$(for((j=ct-i; j>1; j--)); do printf "../"; done)
  find "$subd" -maxdepth 1 -type f -name "$2" -printf "$dots%f\n"
done

biegać upfind $HOME/zt" "Y*" ... co daje następujące wyjście
gdy YABBA istnieje w / , / home / użytkownik , / home / user / zt

../../../YABBA
../YABBA
YABBA
Peter.O
źródło
13

Możesz użyć tego prostego skryptu. Przechodzi w górę drzewa katalogów i wyszukuje określone pliki.

#!/bin/bash
while [[ $PWD != / ]] ; do
    find "$PWD"/ -maxdepth 1 "$@"
    cd ..
done

Stosowanie:

upfind -name 'x*'
choroba
źródło