Chciałbym utworzyć wiele katalogów za pomocą mkdir
. Każda nazwa katalogu będzie się składać z prefiksu (ciąg) i indeksu (liczba całkowita). Załóżmy, że chciałbym, aby prefiks był „s”, a indeksy zawierały się w przedziale od 1 do 50. Oznacza to, że chciałbym utworzyć katalogi zatytułowane:
s1
,, s2
... s49
,,s50
Czy istnieje sposób, aby to zrobić automatycznie przy użyciu mkdir
? Dziękuję za Twój czas.
bash
. Dziękuję za Twój czas!s01
,s02
, ...,s49
,s50
. Gdybym użył wskaźników o stałej szerokości,/bin/ls
prawie zawsze generuje pożądane zamówienie.Odpowiedzi:
Możesz to zrobić za pomocą skryptu powłoki.
Pure sh - zadziała to nawet na powłokach Bourne'a sprzed POSIX:
Jeśli chcesz utworzyć dużą liczbę katalogów, możesz przyspieszyć skrypt, redukując go do pojedynczego wywołania,
mkdir
a także używając wbudowanych powłok do testowania i arytmetyki. Lubię to:Zsh, ksh93 lub bash sprawiają, że jest to o wiele łatwiejsze, ale powinienem zauważyć, że nie jest to wbudowane
mkdir
i może nie działać w innych powłokach. W większych przypadkach może na to również wpływać ograniczenie liczby lub całkowitej wielkości argumentów, które mogą być przekazywane do polecenia.źródło
n=$(( n + 1 ))
byłby tak samo POSIX i nie kosztowałby cię podpowłoki.[[
słowem kluczowym nie jest POSIX. (Nie wspominając o tym, że[
jest to powłoka wbudowana w wiele nowoczesnych powłok).[[
działa na moimksh88
(który poprzedzabash
), więc założyłem, że to POSIX. Nie mogłem znaleźć żadnej wzmianki o tym w specyfikacji POSIX, więc uważam, że masz rację. Dzięki za informację!for i in {range}
dla użytkowników zaawansowanych powłok.Jeden
Dwa
Ta opcja działa w bash , zsh i ksh93
Trzy
źródło
$i
niż zrobić katalog npmkdir s$i ; echo $i > s$i/$i
. Ponadto One jest ładnym, prostym przykładem użycia pętli for w bash ... w takiej witrynie nie jest mało prawdopodobne, aby początkujący użytkownik go zobaczył i pomyślał: „fajnie, nie zdawałem sobie sprawy, że możesz to zrobić „---> oświecenie.Wiele skomplikowanych odpowiedzi tutaj, ale bash sprawia, że jest to naprawdę łatwe. Jasne, czyste rozwiązanie POSIX działa, ale dlaczego nie skorzystać z
bash
powłoki, której używasz? Możesz to zrobić z łatwością dzięki nawiasowi klamrowemu :źródło
mkdir $(seq --format 's%.0f' 1 50)
lub jeśli chcesz liczby uzupełnione zerami (co byłoby lepsze do sortowania):
mkdir $(seq --format 's%02.0f' 1 50)
lub:
mkdir s$(seq -s ' s' -w 1 50)
- zwróć uwagę na ciąg „s” tuż przed$()
, bez niego pierwszym utworzonym katalogiem będzie po prostu „01” zamiast „s01”i w końcu:
mkdir $(printf "s%02i " $(seq 1 50))
seq
pochodzi z GNU Coreutilsco dziwne, sekwencja
--format
lub-f
opcja zezwala tylko na podwójne typy zmiennoprzecinkowe printf (jak f i g. również dziwny format szesnastkowy zmiennoprzecinkowy, do którego nigdy nie znalazłem żadnego zastosowania). Nie mam pojęcia dlaczego. Byłoby miło, gdyby obsługiwał także inneprintf(3)
typy liczbowe, takie jak liczba całkowita (d, i), ósemkowa (o, U) lub szesnastkowa (x, X).W każdym razie podwójny format z dokładnością dziesiętną równą
%.0f
lub%02.0f
zbliżoną do liczby całkowitej do tego celu.Zobacz także: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
źródło
{1,50}
lub{01,50}
(w przypadku wypełniania zerami) jest znacznie łatwiejsze i bardziej zrozumiałe.Aby być innym, oto rozwiązanie sh POSIX, które wykorzystuje rekurencję:
źródło