[geloest] Find - Ergebnisse in Array speichern ohne Pfad

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
ralfoertner
Beiträge: 10
Registriert: 08.10.2015 14:10:57

[geloest] Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von ralfoertner » 10.06.2018 19:27:26

Hallo Script Profis!

Ich bin leider keiner. Deshalb bitte ich euch um Hilfe!

Mein Problem betrifft den Output des Findbefehls.

Ich lese mittels findbefehl aus einem Verzeichnis Unterverzeichnisnamen in ein Array ein. Das funktioniert soweit ganz gut.

Der Findbefehl gibt den Pfad zusätzlich zum Verzeihnisnamen mit aus.

Der Pfad stört mich bei der Weiterverarbeitung, ich entferne ihn mit -printf '%f, auch ok.

Die Verzeichnisnamen entsprechen somit meinem Wunsch, kein Pfad und kein ./ mehr.

Allerdings sind die Ergebnisse jetzt doppelt vorhanden!!

Einmal korrekt und einmal mit ./ davor.

Hier folgt der Code:

while IFS= read -r -d $'\0'; do
folder+=("$REPLY")
done < <(find . -name "$kunde" -type d -printf '%f\n')


Das Ergebnis ist bsbw.

ds_3000 und ./ds_3000

die Namen sind doppelt vorhanden !!

Wie stelle ich das ab?

Googeln hat nicht geholfen.

Habt ihr eine Idee??

Danke im Voraus!!

MfG RO
--
Viele Dank für eure Hilfe!
ralf.oertner@ro-data.de
MfG RO

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von Meillo » 10.06.2018 20:54:51

Sieht so aus wie wenn du Null-terminiert lesen wuerdest, dein Input aber Newline-terminiert ist. Aber ich bin kein Bash-Profi.

Nach einem Blick in die Manpage der Bash frage ich mich, ob nicht das Builtin `readarray' das ist was du eigentlich verwenden solltest.
Use ed once in a while!

Benutzeravatar
MegaV0lt
Beiträge: 163
Registriert: 21.11.2011 11:16:07
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von MegaV0lt » 11.06.2018 08:43:52

Aus einem meiner Skripte:

Code: Alles auswählen

          while IFS= read -r -d '' ; do
...
          done < <(find "$R_TARGET" -maxdepth 1 -type f -printf '%P\0')  # %P = Datei ohne führendes "./" und ohne Pfad
Das %P\0 müsste helfen
"Das Internet? Gibt's diesen Blödsinn immer noch?"
[Homer Simpson], Sicherheitsinspektor im Kernkraftwerk Springfield.

Benutzeravatar
ralfoertner
Beiträge: 10
Registriert: 08.10.2015 14:10:57

Re: Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von ralfoertner » 11.06.2018 10:57:30

Danke für deine Mühe.

Aber wie ich schon geschrieben habe ist das ./ gar nicht mehr mein Problem sondern die Doppelung der Werte.

Nämlich 1x mit ./ und einmal ohne (so wie es sein soll).

RO
--
Viele Dank für eure Hilfe!
ralf.oertner@ro-data.de
MfG RO

Benutzeravatar
ralfoertner
Beiträge: 10
Registriert: 08.10.2015 14:10:57

Re: Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von ralfoertner » 11.06.2018 11:00:42

Meillo hat geschrieben: ↑ zum Beitrag ↑
10.06.2018 20:54:51
Sieht so aus wie wenn du Null-terminiert lesen wuerdest, dein Input aber Newline-terminiert ist. Aber ich bin kein Bash-Profi.

Nach einem Blick in die Manpage der Bash frage ich mich, ob nicht das Builtin `readarray' das ist was du eigentlich verwenden solltest.
Hallo Meilo!
Kannst du das näher erläutern? Vielleicht mit einem Beispiel?
Danke schon mal.
--
Viele Dank für eure Hilfe!
ralf.oertner@ro-data.de
MfG RO

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von Meillo » 11.06.2018 11:14:20

ralfoertner hat geschrieben: ↑ zum Beitrag ↑
11.06.2018 10:57:30
Danke für deine Mühe.

Aber wie ich schon geschrieben habe ist das ./ gar nicht mehr mein Problem sondern die Doppelung der Werte.

Nämlich 1x mit ./ und einmal ohne (so wie es sein soll).
Klappt es denn in der Weise, wie die anderen es gepostet haben? Du kannst nicht unbedingt erwarten, dass du hier die perfekte Antwort auf exakt deine Frage bekommst, aber du bekommst Hinweise und Tipps, die dir helfen koennen, selber die Antwort zu finden. Arbeite also mit dem was hier beigetragen worden ist weiter, gerne auch im Dialog mit uns: Teste unsere Vorschlaege, modifiziere sie fuer deine Situation, poste was damit geht oder nicht geht. Dann haben wir vielleicht auch nochmal neue Tipps.


So auch hier:
ralfoertner hat geschrieben: ↑ zum Beitrag ↑
11.06.2018 11:00:42
Meillo hat geschrieben: ↑ zum Beitrag ↑
10.06.2018 20:54:51
Sieht so aus wie wenn du Null-terminiert lesen wuerdest, dein Input aber Newline-terminiert ist. Aber ich bin kein Bash-Profi.

Nach einem Blick in die Manpage der Bash frage ich mich, ob nicht das Builtin `readarray' das ist was du eigentlich verwenden solltest.
Kannst du das näher erläutern? Vielleicht mit einem Beispiel?
Das kann ich leider nicht, da ich keine Bashisms verwende. Ich habe nur fuer dich in der Manpage der Bash nachgeschaut, ob ich dir vielleicht trotzdem helfen kann. Dabei bin ich zufaellig auf `readarray' gestossen und fand, dass sich das gerade so anhoert wie das was du suchst. Eine Webrecherche dazu wird dir bestimmt Beispiele liefern. Sonst probiere einfach aus. Mehr koennte ich auch nicht tun.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von Meillo » 11.06.2018 11:16:39

Nun, vielleicht doch ganz rudimentaer, ohne es ausprobiert zu haben:

Code: Alles auswählen

find . -name "$kunde" -type d -printf '%f\n' | readarray folder
Koennte evtl. in etwa so funktionieren, ganz ohne Schleife.
Use ed once in a while!

Benutzeravatar
ralfoertner
Beiträge: 10
Registriert: 08.10.2015 14:10:57

Re: Find - Ergebnisse in Array speichern ohne Pfad

Beitrag von ralfoertner » 14.06.2018 21:38:14

Danke für eure Hilfe!

Habe das Problem mittlerweile mit

Code: Alles auswählen

# Verzeichnisnamen einlesen
while IFS= read -r -d $'\0'; do
    folder+=("$REPLY")
done < <(find . -name "$kunde" -type d -printf '%f\n' -print0)
lösen können.

Danke für eure Hilfe!!!
Zuletzt geändert von Meillo am 14.06.2018 21:46:50, insgesamt 1-mal geändert.
Grund: Code-Tags ergaenzt
--
Viele Dank für eure Hilfe!
ralf.oertner@ro-data.de
MfG RO

Antworten