Vraag Is er een manier om meerdere mappen tegelijkertijd te maken met mkdir?


Als ik meerdere mappen (op hetzelfde niveau) wilde maken en het vervolgens een door komma's gescheiden lijst met directorynamen (of iets anders) zou geven?


79
2018-02-09 18:30


oorsprong


man mkdir.... - Sparhawk
Elke keer dat u wilt weten of een opdracht iets kan doen wat u wilt, typt u man gevolgd door de naam van het commando. - David Richerby
@JacobVlijm De GNU coreutils 8.21 manpage voor mkdir zegt: "NAAM mkdir - mappen maken // KORTE INHOUD  mkdir [OPTIE] ... [DIRECTORY] ... // BESCHRIJVING Maak de DIRECTORY ('s) als ze nog niet bestaan. "Dat lijkt vrij duidelijk dat je meer dan één directory kunt maken. - David Richerby
@JacobVlijm Man pages jargon is niet vanzelfsprekend zonder instructie, maar in de technische taal van man pages is de info volkomen duidelijk, zelfs in de gegeven quote. Merk op ... na [DIRECTORY], wat betekent dat dit argument kan worden herhaald. Zo DIRECTORY(ies) verwijst naar alles doorgegeven DIRECTORY argumenten. "RTFM" -reacties vergeten echter soms dat er een notatie is om te leren. - Blaisorblade
@Blaisorblade Bedankt! dat is informatief! - Jacob Vlijm


antwoorden:


Kort antwoord

mkdir neemt meerdere argumenten, gewoon uitvoeren

mkdir dir_1 dir_2

131
2018-02-09 18:32





U kunt lijsten gebruiken om mappen te maken en het kan behoorlijk wild worden.

Enkele voorbeelden om mensen erover te laten nadenken:

mkdir sa{1..50}
mkdir -p sa{1..50}/sax{1..50}
mkdir {a-z}12345 
mkdir {1,2,3}
mkdir test{01..10}
mkdir -p `date '+%y%m%d'`/{1,2,3} 
mkdir -p $USER/{1,2,3} 
  1. 50 mappen van sa1 tot en met sa50
  2. hetzelfde maar elk van de mappen zal 50 keer sax1 tot en met sax50 bevatten (-p zal bovenliggende mappen aanmaken als deze niet bestaan).
  3. 26 mappen van a12345 tot en met z12345
  4. komma gescheiden lijst maakt mappen 1, 2 en 3.
  5. 10 mappen van test01 door test10.
  6. hetzelfde als 4, maar met de huidige datum als directory en 1,2,3 erin.
  7. hetzelfde als 4, maar met de huidige gebruiker als een directory en 1,2,3 erin.

Dus, als ik het goed begrepen heb en je een aantal mappen wilt maken, en binnen die nieuwe mappen, dan zou je dit kunnen doen:

mkdir -p sa{1..10}/{1,2,3}

en krijg sa1, sa2, ..., sa10 en binnen elke mappen 1, 2 en 3.


125
2018-02-09 18:49



Ik ben het eens met @ gniourf_gniourf ... er zijn geen gebruik van reguliere expressies in uw antwoord. Wilde u iets anders zeggen of een ander voorbeeld geven? - Slipp D. Thompson
@gniourf_gniourf gedaan :) - Rinzwind
Vermeldenswaardig is dat brace-uitbreiding niet is gedefinieerd in de POSIX-shell: pubs.opengroup.org/onlinepubs/9699919799/utilities/... Het zal bijvoorbeeld niet werken dash wat de standaard is /bin/sh op Ubuntu. - pabouk
Dit antwoord hangt af van de shell die de uitbreiding van uw invoer uitvoert voordat u die invoer als argumenten voor mkdir. Het is veel nauwkeuriger om gewoon te zeggen dat mkdir meerdere mappen kan maken met meerdere argumenten en dan praten over hoe een bepaalde schaal dat gemakkelijker kan maken. - deed02392
Als ik iets probeer te doen mkdir sa$(seq 0.1 0.1 1), alles wat het doet is het creëren van een directory met de naam sa0.1 en de rest 0.2, 0.3, ..., 1. Hoe kan ik decimale brace-uitbreiding krijgen zonder de hele lijst te schrijven? - Plinth


Het is heel eenvoudig, u kunt een directorystructuur maken zoals:

Websites/
  static/
      cs
      js
  templates/
      html

U kunt het in één opdracht als deze doen:

mkdir -p Website/{static/{cs,js},templates/html}

Zorg ervoor dat u geen spaties invoert


17
2017-09-23 20:28



U kunt ook op het tabblad hier drukken om ze uit te vouwen voordat u de opdracht uitvoert. - Isaac Gregson


Maak een lijst van de namen voor uw gewenste mappen met behulp van regeleinden in plaats van komma's als scheidingsteken. Bewaar die lijst.

mkdir `cat list`

U zou nu alle mappen moeten hebben die in uw lijst staan.


12
2018-02-09 22:53



Goed zo. Denk niet dat ik die eerder zag: D +1 - Rinzwind
Ja, dat zal echter werken met een waarschuwing - de directorynamen moeten een hele reeks zijn. Als een regel is spaced dir , dan maakt het twee mappen, spaced en `richt. - Sergiy Kolodyazhnyy
Ja, je kunt zelfs niet met succes ontsnappen naar de ruimtes, junk\ dir in de list bestand geeft twee mappen, junk\  en dir. Ik kreeg een paniek toen ik een zag \  in een mapnaam. - Jon V
Dit kan worden gecombineerd met de -p vlag vermeld in andere antwoorden. Als dat zo is, de list bestand hoeft bovenliggende mappen niet als eigen regels te bevatten, ze worden automatisch gedetecteerd en gemaakt. - mcw0933


Iets zoals dit? (dankzij Muru voor de printf tip)

printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
$ printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
bar  baz  foo
$ 

Je kunt het in een functie stoppen voor gebruiksgemak:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 

8
2018-02-09 18:49



Gewoon een printf "%s" "$1" | xargs -d, mkdir moet genoeg zijn. - muru


Dus u wilt een door komma's gescheiden lijst met directorynamen? Dat kan worden gedaan.

Shell + coreutils

Omdat iedereen oneliners plaatst, is hier ook de mijne (mkdir + parameter substitutie plus + shell redirection).

DIR:/testdir
skolodya@ubuntu:$ ls

DIR:/testdir
skolodya@ubuntu:$ mkdir $( tr '[,\n]' ' '   < /home/xieerqi/dirList.txt   )                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

AWK

AWK is een tekstverwerkingstaal, maar het is erg leuk system() functie die de standaard shell zal oproepen, en voer de opdracht [s] tussen haakjes in (dit moet een string zijn).

DIR:/xieerqi
skolodya@ubuntu:$ awk -F ',' '{for(i=1;i<=NF;i++) system("mkdir "$i)}' dirList.txt                                    

DIR:/xieerqi
skolodya@ubuntu:$ ls -ld dir*                                                                                         
-rw-rw-r-- 1 xieerqi xieerqi   23 Feb  9 11:41 dirList.txt
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirone/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirthree/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirtwo/

DIR:/xieerqi
skolodya@ubuntu:$ cat dirList.txt                                                                                     
dirone,dirtwo,dirthree

Of je zou kunnen verwijderen , met gsub() functie en oproep system("mkdir "$0) maar dat kan een probleem zijn als u mappen met spaties in hun naam wilt maken

Python

Pythonische manier om hetzelfde te doen, zou zijn om elke regel te lezen, wegwerken van trailing \n , plaats alles in één lijst en herhaal de lijstitems en maak mappen per lijstitem. Houd er rekening mee dat in het onderstaande voorbeeld: /home/xieerqi/dirList.txt is het volledige pad dat aan mijn bestand wordt gegeven en we maken het volledige pad van elke nieuwe map door samen met een tekenreeks te gaan /home/username/ en de naam van de dir die in de lijst wordt gelezen. Vervang zo nodig uw eigen waarden

DIR:/testdir
skolodya@ubuntu:$ ls                                                                                                  

DIR:/testdir
skolodya@ubuntu:$ /home/xieerqi/makeDirs.py                                                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

DIR:/testdir
skolodya@ubuntu:$ cat /home/xieerqi/makeDirs.py
#!/usr/bin/env python
import os
with open("/home/xieerqi/dirList.txt") as file:
   for line in file:
         for directory in line.strip().rsplit(','):
             path = '/home/xieerqi/testdir/' +  directory
             os.makedirs(path)

7
2018-02-09 18:44



Ik denk niet dat de vrager eigenlijk wil de lijst wordt door komma's gescheiden; Ik ben er vrij zeker van dat dit gewoon hun gok was op wat de syntaxis zou kunnen zijn. - David Richerby
Nou, OP heeft waarschijnlijk niet exact een door komma's gescheiden lijst, maar het is zeker dat het als een methode kan worden gebruikt, met als punt dat "lijsten ook kunnen worden gebruikt, je hoeft niet elke naam afzonderlijk in te tikken". Vooral dat is handig als een grote lijst niet met reeksen kan worden gegenereerd, zoals dir{1..1000}. Stel, u wilt een map maken per gebruikersnaam, of per project, of per geografische locatie, zoals een stad - Sergiy Kolodyazhnyy


De mkdir-opdracht neemt meerdere argumenten die eenvoudig worden uitgevoerd zoals hieronder

mkdir dir1 dir2 dir3 ... dirN

Als u meerdere submappen wilt maken, kunt u dat argument in {} doorgeven, zoals hieronder wordt getoond

mkdir dir1 dir2/{subdir1, subdir2, subdir3, subdirN} dir3 dirN

0
2017-07-20 06:38