Mam coś takiego:
% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/
Chcę utworzyć katalog bar
w każdym z podkatalogów foo
.
Jeśli spróbuję to zrobić
% mkdir -p /tmp/foo/*/bar
... dostaję błąd
zsh: no matches found: /tmp/foo/*/bar
(Z perspektywy czasu rozumiem przyczynę błędu.)
Wiem, że mogę rozwiązać pierwotny problem za pomocą pętli for, ale jestem ciekawy, czy zsh
obsługuje jakąś formę rozszerzenia parametrów, która wygenerowałaby pożądany argument dla pojedynczego wywołania mkdir -p
. IOW, rozszerzenie parametru równoważne „dołączaniu /bar
do każdego prefiksu generowanego przez rozwijanie /tmp/foo/*
”, w wyniku czego
% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar
mkdir -p
, który miałby nieco inny efekt niż twoje polecenie nie rzucania błędów, jeśli niektóre z tych katalogów mają jużbar
podkatalogi. Drobny punkt, ale warto tutaj zauważyć. :)${^spec}
i dołączeniebar
do każdego elementu dowolnego elementu/tmp/foo/*(/)
set -- /tmp/foo/*(/)
mkdir -p -- "${^@}/bar"
Jasne - użyj pętli
globusy służą do rozwijania list istniejących elementów, a nie rzeczy, które nie zostały jeszcze utworzone.
źródło
zsh
można rozwinąć globusy i dołączyć tekst za pomocą jednej składni - ale myślę, że to prawdopodobnie jedyny sposób na robienie tego, co chcesz, @ kjo.Jeśli katalogi są w tablicy, możesz użyć
${^...}
formy rozszerzenia.źródło
Możesz użyć
find
ixargs
zrobić to:który wykorzystuje
-maxdepth 1
i-mindepth 1
zapobiega tworzeniubar
w podkatalogach celów i/tmp/foo
odpowiednio w sobie.type d
sprawia, że bierze pod uwagę tylko katalogi.Musisz usunąć,
echo
aby wykonać rzeczywiste działania, w przeciwnym razieecho
wydrukuje tylko wiersze do wykonania. Możesz również dołączyć go do zamiany, tak jak$()
go wykonać.Instrukcja mówi,
xargs -i
jest przestarzałe, ale znalazłem żadnej innej alternatywy równie poręczne, więc powinien nadal pracować przez kilka lat ... Można wymieniać-i
się-I'{}'
aby być na bieżąco z tym.źródło
@loa_in_ miał większość tego, ale
find
dane wyjściowe w potokach wydają się być faux pas.źródło
xargs
z różnymi narzędziami, które nie mają-exec
alternatywy, więc używam mojego podejścia, ponieważ działa z nimi wszystkimi jednakowo.