Mam plik .txt, który zawiera taki tekst
A1/B1/C1
A2/B2/C2
A3/B3/C3
Chcę skryptu, który wczyta plik .txt dla każdej linii, a następnie utworzy katalog na podstawie pierwszego słowa (A1, A2, A3)
Stworzyłem następujący skrypt:
file="test.txt"
while IFS='' read -r line
do
name="line"
mkdir -p $line
done <"$file"
Kiedy go uruchamiam, tworzy katalog A1, a następnie tworzy podkatalogi B1 i C1. to samo dzieje się w przypadku innej linii (A2 * i A3 *)
Co powinienem zrobić, aby utworzyć tylko katalogi A1, A2, A3?
Nie chcę tworzyć nazwy A1 / B1 / C1 ze znakiem „/”. Chcę tylko wziąć słowo przed znak „/” i nadać mu nazwę katalogu. Tylko „A1” „A2” „A3”.
źródło
xargs -a<(....)
zamiast<dirlist.txt cut -d/ -f1 | xargs
?tr
podejście - właśnie zdałem sobie sprawę, żeparallel
ma to domyślnie uwzględnione.xargs -a<(....)
zamiast fajki - ponieważ lubię to w ten sposób, tak proste. :)<(...)
pomaga również ze spacjami, więc jest to zdecydowanie lepszy wybór - nie sądzę, aby ktokolwiek i tak używał tego deskryptora pliku.cut <dirlist.txt
zamiast po prostucut dirlist.txt
?Musisz ustawić
IFS='/'
dla,read
a następnie przypisać każde pierwsze pole do osobnej zmiennej,first
a resztę pól do zmiennejrest
i po prostu pracować na wartości pierwszego pola (Lub możeszread -ar array
do pojedynczej tablicy i użyć"${array[0]}"
dla wartości pierwszego pola.):Lub w pojedynczej linii dla tych, którzy to lubią:
Lub utwórz wszystkie katalogi za jednym razem:
ANSI-C Cytowanie
$'...'
służy do czynienia z nazw katalogów zawierających znaki specjalne.Zauważ, że
_
(może być dowolnym znakiem lub łańcuchem) na końcu będzie argv [0] do,bash -c '...'
a$@
wola będzie zawierać pozostałe parametry, począwszy od 1; bez tego w drugim poleceniu pierwszy parametr domkdir
zostanie utracony.W
${1%%/*}
pomocą powłoki (POSIX sh / atakujących / Korn / zsh) Parametry ekspansji podstawienie usuwa najdłuższy dopasowanie ukośnikiem następnie niczego do końca parametru przechodzącej w nią, która to linia odczytywane przez xargs ;Ps:
echo
przed,mkdir
aby utworzyć te katalogi.-d'\n'
się-0
, czy lista jest oddzielone znakami NUL zamiast o\n
ewline (niby tam jest / są osadzone nowego wiersza w nazwie katalogu).źródło
Zawartość
test.txt
:Skrypt do tworzenia
A[123]
folderów:Wyjście
ls
:źródło
A 12"x4" dir/B b/C c
:?W prostym przypadku, jak pokazano w przykładzie wprowadzania pytania, wystarczy użyć
cut
i przekazać dane wyjściowemkdir
przez viaxargs
Do obsługi przypadków, w których nazwa katalogu może zawierać spacje, możemy dodać
-d '\n'
do listy opcji:W przypadku bardziej skomplikowanych odmian, takich jak
A 12"x4" dir/B b/C c
sugerowane przez @OleTange w komentarzach, można przejśćawk
do tworzenia listy rozdzielonej wartościami zerowymi zamiast listy rozdzielanej znakiem nowej linii.@dessert w komentarzach zastanawiał się, czy
printf
można go użyćcut
, a technicznie rzecz biorąc można go użyć, na przykład poprzez ograniczenie drukowanego ciągu do szerokości tylko 3 znaków:Nie jest to najczystszy sposób, ale okazuje się, że
printf
można go użyć. Oczywiście staje się to problematyczne, jeśli nazwa katalogu staje się dłuższa niż 3 znaki.źródło
A 12"x4" dir/B b/C c
:?używając Perla:
Lub
jeśli chcemy zaakceptować spacje w nazwach katalogów
źródło
perl -ne 'mkdir for /^([^\/]+)/' list.txt
na spacje w nazwach katalogów. W końcu muszę się nauczyć Perla - dziękuję!GNU Parallel może być przesadą dla zadania, ale jeśli zamierzasz robić inne rzeczy dla każdej linii, może to być przydatne:
Prawidłowo radzi sobie z danymi wejściowymi, takimi jak:
źródło