2016-05-10 12 views
1
#!/bin/bash 
prev='placeholder' 
filename='mkDir.txt' 
echo "Starting mkDir script using mkDir.txt." 
while IFS=' ' read line || [[ -n "$line" ]]; do 
    echo "creating dir : $line" 
    if [[ ${line:0:1} == [[:space:]] ]] 
    then 
     cd $prev 
     mkdir $line 
     cd '..' 
    else 
     mkdir $line 
    fi 
    prev=$line 
done < $filename 

Dies ist mein aktuelles Skript. Es erstellt jedoch nicht die Unterverzeichnisse, wie ich es möchte. Meine ideale Textdatei wird wie folgt aussehen:Wie erstellt man mehrere Verzeichnisse mit Unterverzeichnissen aus einer Textdatei?

tester 
    test 
test2 

Die Laschen/Räume sollen, um anzuzeigen, dass dies ein Unterverzeichnis ist. Wie kann ich das zur Arbeit bringen?

+0

Bitte aktualisieren Sie die Frage mit dem Problem mit Ihrem Skript. – sjsam

Antwort

0

Persönlich würde ich eher ein AWK Programm verwenden, um einen Bash-Skript aus der Eingabedatei zu generieren und dann den Bash-Skript ausführen:

#!/bin/awk 
# WARNING: this example assumes there are is no whitespace in the directory names! 
BEGIN { parentdir = "." } 
/^[[:space:]]*$/ { next } 
/^[[:space:]]/ { print "mkdir " parentdir "/" $1; next } 
{ parentdir = $1; print "mkdir " parentdir } 

AWK wie folgt aufgerufen werden: awk -f Datei-with-Code- von-oben mkDir.txt

Eine Datei mit Inhalt mkDir.txt

subdir 
dir1 
subdir 
dir2 
subdir 

würde die Ausgabe

erzeugen
+0

Das ist perfekt. Einfach und es funktioniert. Vielen Dank. –

0

Verwendung Bash arrays

#!/bin/bash - 

function join { local IFS="$1"; shift; echo "$*"; } 

branch=() 
while IFS=/ read -r -a parts; do 
    level=${#parts[@]} 
    branch=(${branch[@]:0:$level}) 

    ((--level)) 

    branch[$level]="${parts[$level]}" 

    mkdir -p $(join/"${branch[@]}") 
done < <(sed -e 's~\t~/~g' input.txt) 
  • join Funktion verbindet $2 .. $* Argumenten $1 Separators
  • sed Befehl tabs mit Schrägstrichen von input.txt Datei ersetzt
  • der Ausgang des sed Befehl umgelenkt wird while Schleife durch process substitution
  • IFS ist die field separator
  • ${branch[@]:0:$level} Extrakte branch Array Elemente aus 0 zu $level - 1 einschließend

In PHP

<?php 
$branch = []; 
$fp = fopen('php://stdin', 'r'); 

while ($line = fgets($fp)) { 
    $parts = explode("\t", $line); 
    $level = count($parts); 
    $branch = array_slice($branch, 0, $level); 
    $branch[$level - 1] = trim($parts[$level - 1]); 

    mkdir(implode('/', $branch), 0755, true); 
} 

fclose($fp); 

Usage:

php script.php < input.txt 
Verwandte Themen