Powiedzmy, że jestem w katalogu, który ma kilka podkatalogów, dir1
, dir2
, i dir3
. Każdy z tych katalogów ma plik foo
i chciałbym wykonać to samo polecenie foo
w każdym z katalogów i zlecić wykonanie tego polecenia z tego katalogu.
Gdybym miał to zrobić „ręcznie”, wyglądałoby to tak:
cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)
Konieczne jest wykonanie polecenia z każdego katalogu . foo
jest skryptem planowania wsadowego (dla HTCondor, jeśli chcesz wiedzieć) i musi zostać wykonany z każdego podkatalogu, aby wyniki uruchomień uruchomione przez skrypty planowania znalazły się w każdym podkatalogu.
Pytanie „ Znajdź plik i wykonaj polecenie w katalogu pliku ”, o ile wiem, nie odpowiada na moje pytanie. Pierwsza odpowiedź na to pytanie jest raczej obejściem, które nie zadziała w moim przypadku, a druga odpowiedź nie zawiera wystarczającego wyjaśnienia, aby wiedzieć, jak z niej korzystać.
Odpowiedzi:
Zakładając, że
find
obsługuje, użyj-execdir
opcji zamiast-exec
Jeśli nie, proszę podać szczegółowe informacje na temat swojej platformy i / lub dystrybucji (odpowiednio).
źródło
{}
, ale rodzic{}
.-exec
, ale określone polecenie jest uruchamiane z podkatalogu zawierającego dopasowany plik ”.Zakładając, że wiesz dokładnie, w których katalogach chcesz uruchomić swoje polecenie,
lub, zapętlając
foo
pliki,Podkładka zapobiega
cd
wpływaniu na katalog roboczy reszty skryptu. W${foo%/*}
rozwinięciu podstawiania parametrów do nazwy katalogu, w którymfoo
plik mieszka (usuwając wszystko po ostatniej/
wartości$foo
).Używając standardu,
find
aby zrobić to samo (w przypadku, gdyfoo
pliki mogą znajdować się głęboko w strukturze katalogów):Innymi słowy: znajdź wszystkie zwykłe pliki o nazwie „foo” w dowolnym miejscu w bieżącym katalogu lub poniżej i podaj nazwy ścieżek do tego skryptu powłoki partiami. Skrypt powłoki powinien iterować po podanych nazwach ścieżek, zmienić katalog na część katalogową każdej nazwy ścieżki, a jeśli to się powiedzie, wykonać
somecommand foo
.Aby uzyskać rozwiązanie wykorzystujące niestandardowe
-execdir
, zobacz odpowiedź roaima . Jego odpowiedź dostosowała się do mojego przykładu:źródło