Ich muss 1000 Eingabedateien erstellen, die Folgendes enthalten:
x=i, i variiert von 1 bis 1000
y = 5
Jede Datei muss in einem separaten Verzeichnis abgelegt werden. Ich habe Folgendes versucht:
mkdir inp
cd inp
max=1000
for ((i=1;i<=max;i++)); do
mkdir dir{$i}
cd dir{$i}
cat input_file.txt
x=i > input_file.txt
y=5 >> input_file.txt
cd inp
done
Was scheitert
Antwort1
Wenn ich Sie richtig verstanden habe, möchten Sie so etwas:
for ((i=1;i<=1000;i++)); do
mkdir -p inp/dir$i
printf 'x=%s\ny=5s\n' "$i" > inp/dir$i/input_file.txt
done
Antwort2
Ihr Code ist falsch. Es wäre besser, cd ..
statt cd inp
, und touch
statt cat
( cat
würde der Befehl einen Fehler für eine nicht vorhandene Datei zurückgeben, touch
erstellen Sie sie). Verwenden Sie außerdem echo
den Befehl (oder printf
wie in erwähnt@terdon Antwort), um in eine Datei zu schreiben.
Wenn Sie also einfach Ihren Code ohne Fehler verwenden möchten, können Sie das wie folgt tun:
mkdir -p inp
cd inp
max=1000
for ((i=1;i<=max;i++)); do
mkdir -p dir{$i}
cd dir{$i}
touch input_file.txt
echo x=i >> input_file.txt
echo y=5 >> input_file.txt
cd ..
done
NB: Wenn Sie Ihre Datei als dir1
,, dir2
… statt dir{1}
,, dir{2}
… benennen möchten, entfernen Sie einfach {}
in mkdir
und cd
den Befehl innerhalb Ihrer Schleife:
mkdir -p dir$i
cd dir$i
NB2: Sie können Ihren Code vereinfachen, indem Sie max
den Wert entfernen oder max
als Parameter abrufen. Bei einem Skript mit dem Namen script.sh
würde es bei der Ausführung folgendermaßen aussehen:
script.sh 100
und der Code:
mkdir -p inp
cd inp
for ((i=1;i<=$1;i++)); do
mkdir -p dir$i
cd dir$i
touch input_file.txt
echo x=$i >> input_file.txt
echo y=5 >> input_file.txt
cd ..
done