/ / Versuchen, eine Zeichenfolge in awk zu erstellen, beschwert sich über die Division mit Null - Bash, Unix, Awk, Terminal

Versuch, eine Zeichenfolge in awk zu erstellen, beschwert sich über die Division mit Null - Bash, Unix, Awk, Terminal

Ich versuche ein Skript automatisch zu erstellenErstellen Sie Symlinks zu allen meinen Ordnern in einem bestimmten Ordner, das sollte nicht zu schwer sein, aber aus irgendeinem Grund werden meine Variablen innerhalb dieses Oneline-Skripts wirklich seltsam verteilt.

#!/bin/bash
# ----------------------------------
# --------- TotalKrill -------------
# ----------------------------------
# Script to create symlinks to my clouded folder in my home directory by listing all  folders/files in the cloudfolder and then creating symlinks in destfolder
#
myname=`whoami`
searchfolderdir=/home/$myname/
searchfoldername=ownCloud
destfolder=~/
Target=$searchfolderdir$searchfoldername/

ls -1 $searchfolderdir$searchfoldername | awk {"print ln -fs $Target$0 $destfolder/$0"} #|sh

Aber ich bekomme eine Ausgabe: awk: cmd. Zeile: 1: (FILENAME = - FNR = 1) fatal: Division durch Null versucht

Kann mir bitte jemand einen besseren Ansatz zeigen oder mir sagen, wie ich dieses Skript reparieren kann? das "| sh" ist auskommentiert, damit ich vor dem Ausführen eine korrekte Zeile bekommen kann.

Auf einer Ubuntu 12.10 x64 Box versucht es zum Laufen zu bringen.

Antworten:

1 für die Antwort № 1

Was du brauchst ist (syntaktisch zumindest):

awk -v t="$Target" -v d="$desfolder" "{print "ln -fs",t$0,d"/",$0}"

Anmerkungen:

  • Wenn Sie nicht den Divisionsoperator, sondern den Literal-Char benötigen / Sie müssen es in doppelte Anführungszeichen einschließen.

  • Zeichenfolgen müssen in doppelte Anführungszeichen eingeschlossen werden awk wie die Schnur ln -fs

  • Sie müssen Shell-Variablen mit awk an awk übergeben -v Möglichkeit.

  • Sie sollten immer Ihre Variablen angeben.

  • Die geschweiften Klammern, die den Block einschließen, müssen innerhalb der einfachen Anführungszeichen stehen.


Hinzufügen von ein paar anderen Fixes wie zum Beispiel find um nur Verzeichnisse zurückzugeben:

#!/bin/bash

myname=$(whoami)
dir="/home/$myname/"
folder="myCloud"
destination="~/"
target="${dir}${folder}"

find "${target}" -maxdepth 1 -type d -print |
awk -v t="$target" -v d="$destination" "{print "ln -fs",t$0"/",d}"