ubuntuusers.de

Ordner Rekursiv auflisten und Dateiinformationen herauslesen

Status: Gelöst | Ubuntu-Version: Ubuntu 17.10 (Artful Aardvark)
Antworten |

giphy86

Anmeldungsdatum:
21. März 2018

Beiträge: 27

Hallo zusammen, ich suche gerade nach einem kleinen Script was folgendes macht :

in den Unterverzeichnissen von /home/x/x/y/y/z nach files mit der Endung .sh sucht. Wenn Dateien gefunden werden sollen diese die in eine .csv datei geschrieben werden. Pro Verzeichnis eine Zeile

Verzeichnisname
Anzahl der Files
Anzahl der Datensätze in den Dateien in dem Verzeichnis
Datum/Uhrzeit älteste Datei 
Datum/Uhrzeit jüngste Datei 

Sind keine Dateien in den Unterverzeichnissen zu finden, so soll die Ausgabe Datei leer bleiben.

Hat jemand eine Idee die möglichst kurz ist ?

Danke

Bearbeitet von rklm:

Feldliste in Codeblock

cosinus

Avatar von cosinus

Anmeldungsdatum:
11. Mai 2010

Beiträge: 1374

Wohnort: HB

in den Unterverzeichnissen von /home/x/x/y/y/z nach files mit der Endung .sh sucht.

Das erledigt doch find für dich:

find /home -name *.sh -type f

Damit hättest du schonmal alle Dateien (type f) mit Endung .sh aufgelistet. Pipe diese Ausgabe mit wc -l und und du erhälst die Anzahl.
Vllt kannst du auch mal Sinn und Zweck beschreiben des Vorhaben, denn wenn man weiß was erreicht werden soll, ist es meist einfacher und besser zu helfen.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

@cosinus: Da erhältst Du vielleicht die Anzahl. Dateinamen können auch Zeilenumbrüche enthalten. Und *.sh sollte man dringend in Anführungszeichen setzen, denn sonst expandiert die Shell das vor dem Aufruf falls im aktuellen Arbeitsverzeichnis Dateien liegen auf die das Muster passt.

Edit: Wenn man nur die Dateien (insgesamt) zählen wollte, könnte man das so machen:

1
find /home -name '*.sh' -exec echo \; | wc --lines

@giphy86: Ich nehme mal an in Deinem dritten Absatz im ersten Beitrag fehlen irgendwie Trennzeichen. Kannst Du die eventuell nachliefern, damit man nicht raten muss welche Worte jeweils zu einer Spalte gehören‽ Danke. ☺

find wurde ja schon erwähnt. Da muss man dann aber noch irgendwie damit umgehen das Du ja eigentlich gar nicht die Dateinamen mit *.sh haben möchtest, sondern die Verzeichnisse in denen solche Dateien liegen.

CSV und Verzeichnissnamen sind dann noch ein kleines aber lösbares Problem, denn da muss man darauf achten, dass in einem Verzeichnisnamen auch das Trennzeichen der CSV-Datei vorkommen könnte. Da muss man dann entsprechend durch quoten den Wert schützen. Dann natürlich auch darauf achten, dass das Quotezeichen im Verzeichnisnamen vorkommen kann, und das dann auch entsprechend geschützt werden muss. Und das Datensatztrennzeichen, also das Zeilenende, kann auch in Verzeichnisnamen vorkommen, und muss entsprechend geschützt werden.

Mir wäre das für ein Shellskript ja schon zu kompliziert und ich würde auf eine richtige Programmiersprache zurückgreifen. Am besten eine für die es eine Bibliothek für CSV-Dateien gibt, damit man sich da nicht mit den Details herumschlagen muss und Fehler vermeidet.

cosinus

Avatar von cosinus

Anmeldungsdatum:
11. Mai 2010

Beiträge: 1374

Wohnort: HB

Das war ja auch nur ein erster Wurf, ich hab nirgends geschrieben, dass mein Befehl so wie er da ist perfekt für den TO sei 😇
Meinst du echt Zeilenumbrüche oder nicht eher Leerzeichen?

giphy86

(Themenstarter)

Anmeldungsdatum:
21. März 2018

Beiträge: 27

Danke für die schnelle Antwort. deine Lösung liefert leider auch andere Dateitypen zurück. Habe jetzt aber zumindest schon mal die Lösung für das suchen aller sh Dateien in sämtlichen Unterodrdern gefunden.

Es sollen später eigentlich csv Dateien durchsucht werden für Auswertungszwecke.

1
find /home/kismet/Desktop/untitled/ -iname "*.sh"

Gut wäre jetzt noch wenn die Ausgabe die Anzahl der gefunden Dateien enthält und die jeweilige Gesamtgröße der Dateien in den Unterordnern und der einzelnen Dateien

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

@cosinus: Ich meine echt Zeilenumbrüche. Dateinamen können auf ”unixoiden” Dateisystemen in der Regel alle Zeichen/Bytewerte enthalten ausser dem Pfadtrenner und dem Nullbyte.

giphy86

(Themenstarter)

Anmeldungsdatum:
21. März 2018

Beiträge: 27

Marc_BlackJack_Rintsch

  • Verzeichnisname

  • Anzahl der Files

  • Anzahl der Datensätze in den Dateien in dem Verzeichnis Datum/Uhrzei

  • älteste Datei Datum/Uhrzeit

  • jüngste Datei

dabei muss noch dazugesagt werden dass es sich nicht um .sh Dateien sondern .xxx Dateien mit Inhalt handelt

Leider muss das ganze aber in Bash programmiert werden

cosinus

Avatar von cosinus

Anmeldungsdatum:
11. Mai 2010

Beiträge: 1374

Wohnort: HB

mit -iname statt -name erhälst du aber Dateien mit der endung .SH oder .sH - ist das so gewollt?

giphy86

(Themenstarter)

Anmeldungsdatum:
21. März 2018

Beiträge: 27

das ist so gewollt ja

Hefeweiz3n Team-Icon

Moderator, Webteam
Avatar von Hefeweiz3n

Anmeldungsdatum:
15. Juli 2006

Beiträge: 5814

Wohnort: Ankh-Morpork

Ein paar Tips um dann an die Infos der Dateien/Verzeichnisse zu kommen:

dirname um den Verzeichnisnamen zu finden
stat um Informationen über Dateien/Ordner sauber formatieren zu können (man stat ausführen ☺, und nein: KEIN ls benutzen!)

Logisch willst du hier vermutlich am ehesten mit mehreren Schleifen arbeiten, also erstmal alle Dateien finden, dann die Verzeichnisliste bauen ohne Duplikate (uniq ist dein Freund) um danach die gewünschten Infos pro Verzeichnis zu finden.

giphy86

(Themenstarter)

Anmeldungsdatum:
21. März 2018

Beiträge: 27

1
2
3
4
5
6
7
8
#!/bin/bash

DIR=/home/X/X/inf/X/$1/

if [ $DIR/*.dat ]
then
find $DIR -iname "*.dat" | wc -l
fi

Bisher suche ich eher nach ner Möglichkeit über eine IF Bedingung zu Testen ob überhaupt Files im Ordner und Unterordnern vorhanden sind. Der oben genannte Code gibt mir jedoch einen Fehler aus. Vllt gibt es ja ne Möglichkeit mit file oder Kommando zu prüfen?

giphy86

(Themenstarter)

Anmeldungsdatum:
21. März 2018

Beiträge: 27

1
if test -f ./*.data; then echo existiert; else  echo existiert nicht; fi

gibt es eine Möglichkeit , das der Code auch in Unterordnern nach .data filees sucht ?

giphy86

(Themenstarter)

Anmeldungsdatum:
21. März 2018

Beiträge: 27

1
if [ -z $(find . -iname "*.sh") ]; then  echo leer;else echo existiert; fi

Bei dieser Prüfung gibt er mir zwar etwas aus , jedoch wird auch ein Fehler ausgegeben "too many arguments". Kann das daran liegen das er mehrere Datein gefunden hat ?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

@giphy86: find sucht rekursiv. Bei dem was Du haben möchtest, würde ich aber eher selbst eine rekursive Funktion schreiben. Das Globbing-Muster "$base/"*/ passt auf alle Verzeichnisse im $base-Verzeichnis.

cosinus

Avatar von cosinus

Anmeldungsdatum:
11. Mai 2010

Beiträge: 1374

Wohnort: HB

Wieso MUSS MAN das denn vorher prüfen 😲 wenn es keine Dateien mit dem Suchmuster gibt, spuckt find doch einfach nix aus

Antworten |