Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 21

Thema: Problem bei Script, das Dateien in eine Datei packt

  1. #1
    Registrierter Benutzer
    Registriert seit
    Jan 2009
    Beiträge
    103

    Problem bei Script, das Dateien in eine Datei packt

    Hallo,

    nachdem ich jetzt ohne wirkliche Kenntnisse schon seit Stunden dran sitze, ein wirklich einfaches Skript zu schreiben, kapituliere ich jetzt.

    Mein Ziel ist folgendes:

    Ich möchte das Skript starten, dann einen Projektnamen eingeben und Enter drücken. Den Rest soll das Skript für mich machen. Und zwar sollen *.java Dateien in einem bestimmten Ordner zusammen in eine Datei gepackt werden. Wichtig dabei ist jedoch, dass 1 oder evtl. 2 Leerzeilen zwischen jeder *.java Datei eingefügt werden.

    Code:
    #!/usr/bin/bash
    
    # Please adjust the following path to the directory of your projects.
    # It is recommended to end with a slash "/", otherwise it might not work.
    path='/home/user/'
    
    # Function that changes the directory from the current to "path/project"
    function current_to_destination () {
          current_path=`pwd`		# saving current path in variable "current_path"
          cd ${path}${project}		# changing to directory "path/project"
    }
    
    # Function that counts all *.java files in the project folder
    function count_files () {
          current_to_destination
          ls *.txt | wc -l
          cd ${current_path}
    }
    
    pew='ls *.txt'
    
    # Function that searches and displays all *.java files in the project folder
    function display_files () {
          current_to_destination
          ${pew}
          #pew=ls -1 *.txt
          cd ${current_path}
    }
    
    #      cat *.txt > ergebnis.txt
    #      cat "\n" >> ergebnis.txt
    echo -n "Please enter project name: "
    read project				# saving the project name in variable "project"
    echo "The following *.java files have been found:"
    
    display_files
    pwd
    count_files
    pwd
    $pew
    $pew

    Bitte nicht durch komische Namen irritieren lassen oder warum am Ende so viel Mist steht, das sind nur Dinge, die ich ausprobiert habe oder etwas überprüfen wollte (z.B. das pwd^^).

    Letztendlich werden es .java Dateien seien, aktuell teste ich noch mit .txt Dateien herum.


    Das Problem besteht darin, dass ich es nicht schaffe, die erwähnte Leerzeile einzufügen. Hinter der letzten .java Datei soll keine Leerzeile mehr kommen.


    Falls ihr mir helfen könntet, das wäre super

    Viele Grüße,

    guy.brush™
    Geändert von guy.brush[TM] (22.05.09 um 23:07 Uhr)
    Arch-Linux-Neuling :)

    Nein, ich leide nicht an PEBKAC, es sieht nur immer so aus *g*,
    denn ich leide chronisch an Murphy's Law.

  2. #2
    Geiler Bock Avatar von Painkiller
    Registriert seit
    Jan 2002
    Ort
    bei Bremen
    Beiträge
    2.247
    Reicht sowas?

    Code:
    #!/bin/bash
    
    IFS="
    "
    
    for datei in /pfad/*.java ; do
    
    echo $datei >> file
    echo "" >> file
    echo "" >> file
    
    done


    Edit: Mit Leerzeichen innerhalb der Dateien.

  3. #3
    Registrierter Benutzer
    Registriert seit
    Jan 2009
    Beiträge
    103
    Moin,

    versteh ich die Schleife so richtig?

    Er arbeitet alle *.java Dateien im /pfad/ ab und schreibt solange die Datei und 2 Leerzeilen (geht nicht auch mit \n ?) bis er alle .java Dateien einmal dran hatte? Meine Befürchung war, dass er bei der Methode rekursiv alle durchläuft und dann von vorne anfängt *g*. Allerdings konnte ich auch die Bedingung nicht formulieren^^.

    Was mir nicht ganz klar ist:

    Was ist

    IFS="
    "

    sowie was genau $datei? Ach soo...du sagst mit der Syntax der Schleife ungefähr:

    *for* [nehme Variable datei für folgende Bedingung] *in* /pfad/*.java
    *do*
    blubb
    *done*


    Die *in Sternchen* sollen eingebaute Befehle sein^^ Wobei der ; falsch sein sollte oder?


    Edit:
    Habe es versucht, anzupassen. Funktioniert noch nicht ganz^^
    Code:
    #!/usr/bin/bash
    
    # Please adjust the following path to the directory of your projects.
    # It is recommended to end with a slash "/", otherwise it might not work.
    path='/home/user/'
    
    # Function that changes the directory from the current to "path/project"
    function current_to_destination () {
          current_path=`pwd`		# saving current path in variable "current_path"
          cd ${path}${project}		# changing to directory "path/project"
    }
    
    # Function that counts all *.java files in the project folder
    function count_files () {
          current_to_destination
          ls *.txt | wc -l
          cd ${current_path}
    }
    
    pew='ls *.txt'
    
    # Function that searches and displays all *.java files in the project folder
    function display_files () {
          current_to_destination
          #${pew}
          ls -1 *.txt
          cd ${current_path}
    }
    
    # Function blubbel
    function schleifen () {
          for file in ${path}${project}/*.txt
          do
    	  cat ${file} >> ${path}${project}/ergebnis.txt
    	  echo -e "\n" >> ${path}${project}/ergebnis.txt
          done
    }
    
    
    #      cat *.txt > ergebnis.txt
    #      cat "\n" >> ergebnis.txt
    echo -n "Please enter project name: "
    read project				# saving the project name in variable "project"
    echo "The following *.java files have been found:"
    
    display_files
    pwd
    count_files
    pwd
    schleifen
    echo 'test \n test2'

    Folgende Probleme noch:

    a) \n mag er doch nicht irgendwie^^
    b) Leerzeile dann auch in der letzten Datei
    c) Die erste gefundene .java Datei hängt nur den Text an, sollte aber die Datei neu erzeugen (sonst hat man bei 2x ausführen alles doppelt)
    d) Man muss die Schleife abbrechen oder so, falls er die ergebnix.txt im Ordner findet, da er sonst sagt "output file is input file"


    Ich denke, d) krieg ich evtl. hin, a)-c) habe ich aber keine Ahnung

    Edit 2:
    Also a) geht nun, hatte das mit "-e" irgendwo gefunden. Aber wofür steht diese Option "-e"? o.O
    Geändert von guy.brush[TM] (23.05.09 um 10:24 Uhr)
    Arch-Linux-Neuling :)

    Nein, ich leide nicht an PEBKAC, es sieht nur immer so aus *g*,
    denn ich leide chronisch an Murphy's Law.

  4. #4
    kleiner Pinguin Avatar von Wene
    Registriert seit
    Jan 2004
    Ort
    Schweiz
    Beiträge
    1.488
    Zitat Zitat von guy.brush[TM] Beitrag anzeigen
    Aber wofür steht diese Option "-e"? o.O
    Zitat Zitat von man 1 echo
    -e enable interpretation of backslash escapes
    *zehnzeichen*
    Sudoku? Das ist doch dieses Kreuzworträtsel für Legastheniker oder?

  5. #5
    Registrierter Benutzer
    Registriert seit
    Mar 2009
    Beiträge
    10
    Zitat Zitat von guy.brush[TM] Beitrag anzeigen
    ...
    Wobei der ; falsch sein sollte oder?
    ...
    Nein, denn wie du siehst steht for und do in der selben Zeile und muss somit irgendwie getrennt werden - während bei dir eine Zeile mit for usw. kommt und dann erst do in der nächsten Zeile

    Zitat Zitat von guy.brush[TM] Beitrag anzeigen
    ...
    a) \n mag er doch nicht irgendwie^^
    b) Leerzeile dann auch in der letzten Datei
    c) Die erste gefundene .java Datei hängt nur den Text an, sollte aber die Datei neu erzeugen (sonst hat man bei 2x ausführen alles doppelt)
    d) Man muss die Schleife abbrechen oder so, falls er die ergebnix.txt im Ordner findet, da er sonst sagt "output file is input file"


    Ich denke, d) krieg ich evtl. hin, a)-c) habe ich aber keine Ahnung
    ...
    a) -
    b) Lösche doch einfach die Leerzeile wenns sie dich stört
    c) Lösche Ergebnis.txt vor der Schleife und sie wird neu erstellt werden
    d) gut
    Geändert von loobo (23.05.09 um 17:38 Uhr)

  6. #6
    Geiler Bock Avatar von Painkiller
    Registriert seit
    Jan 2002
    Ort
    bei Bremen
    Beiträge
    2.247
    Zitat Zitat von guy.brush[TM] Beitrag anzeigen
    Was mir nicht ganz klar ist:

    Was ist

    IFS="
    "
    Die IFS Variable ist sozusagen der Worttrenner, default hat die Bash Leerzeichen, Tabs und Newlines eingestellt. Dateinamen mit Leerzeichen wuerden somit wie mehrere Strings behandelt werden.

  7. #7
    Sith Lord
    Registriert seit
    Apr 2009
    Beiträge
    1.438
    Zitat Zitat von guy.brush[TM] Beitrag anzeigen
    Was ist

    IFS="
    "
    Die "Internal Field Separator"-Umgebungsvariable.
    Siehe "man bash"
    • PARAMETERS -> "Shell Variables" -> IFS
    • EXPANSION -> Word Splitting


    $IFS zu verändern kann später im Script Komplikationen verursachen, die schwer zu finden sind, daher ist es ratsam lieber folgendes zu verwenden:
    Code:
    liste | while read -r zeile; do
    	echo "$zeile";
    done
    ... statt solcher Varianten:
    Code:
    IFS='
    ';
    for zeile in $(liste); do
    	echo "$zeile";
    done
    Vor allem sieht man nicht direkt, was alles in $IFS gesteckt wurde. (Ist da vielleicht ein Leerzeichen oder ein Tab nach dem ersten Quote versteckt...)

    Natürlich habe ich Verständnis dafür, wenn man ganz sicher weiß, dass das Script überschaubar bleibt und man daher lieber ein bisschen pfuschen will.

  8. #8
    Registrierter Benutzer
    Registriert seit
    Jan 2009
    Beiträge
    103
    Ich habe es mal so abgeändert:

    Code:
    # Function blubbel
    #function schleifen () {
    #      ${path}${project}/*.txt | while read -r file
    #      do
    #	  cat ${file} >> ${path}${project}/ergebnis.txt
    #	  echo -e "\n" >> ${path}${project}/ergebnis.txt
    #      done
    #}
    (Dass es auskommentiert ist, bitte nicht beachten^^).

    Jetzt meckert er herum, er hätte keine Permission für text1.txt und erstellt somit keine ergebnis.txt :/



    PS: Kann man eine Funktion nicht in einer anderen Funktion aufrufen?

    Code:
    function schleifen () {
          $count
          for file in ${path}${project}/*.txt
          do
    	  if [${count} == ${count}]
    	      then
    		cat ${file} > ${path}${project}/ergebnis.txt
    		echo -e "\n" >> ${path}${project}/ergebnis.txt
    		count--
    		$count
    	  elif [${count} == 1]
    	      then
    		cat ${file} >> ${path}${project}/ergebnis.txt
    		count--
    		$count
    	  else
    		cat ${file} >> ${path}${project}/ergebnis.txt
    		echo -e "\n" >> ${path}${project}/ergebnis.txt
    	  fi
          done
    }
    sowie

    Code:
    count="count_files"
    
    function count_files () {
          current_to_destination
          ls *.txt | wc -l
          cd ${current_path}
    }

    Ausgabe:
    Code:
    baum2.sh: line 37: [count_files: command not found
    baum2.sh: line 43: [count_files: command not found
    baum2.sh: line 37: [count_files: command not found
    baum2.sh: line 43: [count_files: command not found

    Edit:
    Ach, musste [ Bedingung ] machen, also Leerzeichen einfügen Ich Knilch

    Allerdings kennt er das Decrement count-- bzw. auch $count-- nicht ^^
    Geändert von guy.brush[TM] (24.05.09 um 15:03 Uhr)
    Arch-Linux-Neuling :)

    Nein, ich leide nicht an PEBKAC, es sieht nur immer so aus *g*,
    denn ich leide chronisch an Murphy's Law.

  9. #9
    Sith Lord
    Registriert seit
    Apr 2009
    Beiträge
    1.438
    Wer ist eigentlich dieser mysteriöse "er", von dem Du ständig schreibst, guy.brush[TM]?

  10. #10
    Geiler Bock Avatar von Painkiller
    Registriert seit
    Jan 2002
    Ort
    bei Bremen
    Beiträge
    2.247
    Vielleicht spricht guy.brush[TM] seinen Rechner mit Namen an.

  11. #11
    Mod. FAQ/Howto/Emulation
    Registriert seit
    Sep 2000
    Beiträge
    17.397
    Du solltest mal die AGB überarbeiten. Die Wehrmachtsteuer ist jetzt 3/100 höher.

  12. #12
    Registrierter Benutzer
    Registriert seit
    Jan 2009
    Beiträge
    103
    Moin,

    hmm...er...die Bash *g* Das Skript^^ Oder so^^

    Code:
    #!/usr/bin/bash
    
    # Please adjust the following path to the directory of your projects.
    # It is recommended to end with a slash "/", otherwise it might not work.
    path='/home/user/'
    
    # Function that changes the directory from the current to "path/project"
    function current_to_destination {
          current_path=`pwd`		# saving current path in variable "current_path"
          cd ${path}${project}		# changing to directory "path/project"
    }
    
    # Function that counts all *.java files in the project folder
    function count_files {
          current_to_destination
          ls *.java | wc -l
          cd ${current_path}
    }
    
    # Function that searches and displays all *.java files in the project folder
    function display_files {
          current_to_destination
          ls -1 *.java
          cd ${current_path}
    }
    
    # Function that removes the print file if it is existing
    function remove_printfile {
          current_to_destination
          if [ -f print_${project}.java ]
    	  then
    	    rm ${path}${project}/print_${project}.java
    	    cd ${current_path}
          fi
    }
    
    #count=count_files
    
    # Function blubbel
    function concatenate {
          $count
          for file in ${path}${project}/*.java
          do
    	  if [ ${count} == ${count} ]
    	      then
    		cat ${file} > ${path}${project}/print_${project}.java
    		echo -e "\n" >> ${path}${project}/print_${project}.java
    		count=`expr ${count} - 1`
    		$count
    	  elif [ ${count} == 1 ]
    	      then
    		cat ${file} >> ${path}${project}/print_${project}.java
    		count=`expr ${count} -1`
    		$count
    	  else
    		cat ${file} >> ${path}${project}/print_${project}.java
    		echo -e "\n" >> ${path}${project}/print_${project}.java
    	  fi
          done
    }
    
    # Function blubbel
    #function schleifen () {
    #      ${path}${project}/*.java | while read -r file
    #      do
    #	  cat ${file} >> ${path}${project}/print_${project}.java
    #	  echo -e "\n" >> ${path}${project}/print_${project}.java
    #      done
    #}
    
    
    x=3
    echo ""
    echo -n "Please enter project name: "
    read project				# saving the project name in variable "project"
    echo ""
    echo "The following $x count_files *.java files have been found: "
    echo ""
    display_files
    echo ""
    remove_printfile
    echo -e "Removing \"print_${project}.java\" if file is existing...[DONE]"
    concatenate
    echo -e "Concatenating all *.java files to one file...[DONE]"
    echo -e "Creating file: print_${project}.java...[DONE]"
    
    echo "blub1"
    count_files
    echo "blub2"
    $count
    echo "blub3"
    $count_files

    Was nicht funktioniert:

    (1) Ich brauch die Funktion count_files, kann aber weder im echo unten noch in der Funktion concatenate nutzen. Ich brauch da einfach die Anzahl der Dateien.

    (2) Ich kann die Variable count (die ja eigentlich den Zahlenwert von count_files beinhalten sollte, aber nicht ausgibt) nicht pro Schleife -1 rechnen. So könnte ich am einfachsten den ersten und letzten Fall selektieren.

    (3) while statt for Schleife geht nicht


    Wäre nett, wenn ihr mir da noch helfen könntet
    Arch-Linux-Neuling :)

    Nein, ich leide nicht an PEBKAC, es sieht nur immer so aus *g*,
    denn ich leide chronisch an Murphy's Law.

  13. #13
    Milchmann Avatar von m.o.o.
    Registriert seit
    May 2003
    Beiträge
    1.192
    Hallo,

    count wird niemals gesetzt, wahrscheinlich weil die Funktion count_files falsch ist:
    Code:
    function count_files {
          current_to_destination
          count=`ls -1 *.java | wc -l`
          cd ${current_path}
    }
    .

    Die Zeile
    Code:
    $count
    führt das Kommando, das in count steht aus. Ich denke nicht, dass du das willst.

    Das if-Statement (so wie der ganze if-Block)
    Code:
    if [ ${count} == ${count} ]
    macht wenig Sinn, da es immer wahr ist.

    Gruß, Florian

    EDIT: wegen der while-Schleife: da fehlt ein ls -1:
    Code:
    function schleifen () {
          ls -1 ${path}${project}/*.java | while read -r file
          do
    	  cat ${file} >> ${path}${project}/print_${project}.java
    	  echo -e "\n" >> ${path}${project}/print_${project}.java
          done
    }
    Geändert von m.o.o. (24.05.09 um 22:16 Uhr)
    Sie können sich nicht auf Ihre eigene Ignorier-Liste setzen.

  14. #14
    Registrierter Benutzer
    Registriert seit
    Jan 2009
    Beiträge
    103
    Was bringt es mir, eine (lokale?) Variable in der Funktion count_files einzubinden mit count=`...`?

    Mit count="count_files" hatte ich versucht, folgendes zu erreichen:

    Ich wollte die Ausgabe von count_files (die Funktion zeigt schon die richtige Anzahl an Dateien an, die in dem Ordner vorhanden sind...allerdings nur, wenn ich irgendwo am Ende des Skripts einfach "count_files" (ohne " ) ausführe) umleiten in eine Variable. Die Variable sollte einfach nur eine Zahl als Wert haben und nicht mehr auf die Funktion verweisen.

    Dann könnte ich diese nämlich in der concatenate Funktion verwenden, denn dort möchte ich sie ja jedesmal um 1 verringern. Dann machen die if Abfragen nämlich schon Sinn, wenn ich einen kleinen Fehler behebe:

    Code:
    # Function that concatenates all *.java files in "/path/project" to one file
    function concatenate {
          $count
          for file in ${path}${project}/*.java
          do
    	  if [ ${countl} == ${count} ]
    	      then
    		cat ${file} > ${printfile}
    		echo -e "\n" >> ${printfile}
    		countl=`expr ${countl} - 1`
    		$countl
    	  elif [ ${countl} == 1 ]
    	      then
    		cat ${file} >> ${printfile}
    		countl=`expr ${countl} -1`
    		$countl
    	  else
    		cat ${file} >> ${printfile}
    		echo -e "\n" >> ${printfile}
    	  fi
          done
    }
    countl ist also meine neue Zählvariable^^.


    Edit:
    Ok, while Schleife eingefügt und das aus dem Post hier angepasst. Wobei ich annehme, dass das -1 nicht unbedingt notwendig wäre.
    Fehlermeldung:

    Code:
    expr: non-numeric argument
    baum.sh: line 50: [: ==: unary operator expected
    baum.sh: line 56: [: ==: unary operator expected
    baum.sh: line 50: [: ==: unary operator expected
    baum.sh: line 56: [: ==: unary operator expected
    Wie gesagt, irgendwie ist mir klar, dass es so nicht funktioniert sollte. count sowie countl verweisen ja eigentlich nur auf die Funktion, aber letztendlich brauche ich Zahlen, um Vergleiche anstellen zu können. Und countl soll ja auch noch meine Zählvariable sein^^.
    Nur keine Ahnung, wie ich das umsetzen soll :/
    Geändert von guy.brush[TM] (24.05.09 um 22:33 Uhr)
    Arch-Linux-Neuling :)

    Nein, ich leide nicht an PEBKAC, es sieht nur immer so aus *g*,
    denn ich leide chronisch an Murphy's Law.

  15. #15
    Milchmann Avatar von m.o.o.
    Registriert seit
    May 2003
    Beiträge
    1.192
    Die Zeile, in der du count gesetzt hast, war auskommentiert, deshalb habe ich die nicht beachtet. Soweit ich weiß, kannst du die Variable auch lokal in der Funktion setzen, die aufrufende Funktion bzw. die Ebene weiter oben erhält dann auch den geänderten Inhalt (es handelt sich also um eine globale Variable).
    Mit
    Code:
    count="count_files"
    $count
    wird zwar die Funktion count_files aufgerufen, aber du speicherst (wie du schon bemerkt hast) nirgendwo ab, wie viele Dateien gezählt wurden. Das würde mit
    Code:
    count=`count_files`
    gehen.
    Übrigens bezweifle ich stark, dass count_files in deiner Version immer die richtige Anzahl von Dateien liefert, da ohne die Option -1 mehrere Dateien pro Zeile ausgegeben werden können.

    Zur if-Verzweigung: auch die Korrektur macht wenig Sinn, es wird immer der letzte Block ausgeführt, da die Initialisierung von countl fehlt. Du musst countl also noch initialisieren und dann den expr-Befehl ausbessern (da müsste countl als Argument angegeben werden). Im Fall countl != count && count != 1 wird die Zählvariable nicht mehr angepasst. Der Aufruf $countl ist falsch.
    Übrigens wird auch eine neue Datei angelegt, wenn mit >> umgeleitet wird, d.h. du kannst zwei behandelte Fälle zusammenlegen.

    Hab mein Posting weiter oben nochmal editiert wegen der while-Schleifen-Variante.

    Gruß, Florian
    Sie können sich nicht auf Ihre eigene Ignorier-Liste setzen.

Ähnliche Themen

  1. Was haltet ihr von WINDOWS ?
    Von Odin3011 im Forum Meldungen und Mitglieder
    Antworten: 144
    Letzter Beitrag: 06.11.07, 21:39
  2. FRITZ!WLAN USB STICK will nicht mehr
    Von Cali37 im Forum Anbindung an die Aussenwelt
    Antworten: 9
    Letzter Beitrag: 26.01.06, 08:00
  3. Problem mit Festplatte
    Von gaansch im Forum stationäre Hardware
    Antworten: 6
    Letzter Beitrag: 27.01.04, 20:38
  4. CPU-Temperatur
    Von BLUESCREEN3D im Forum Linux Allgemein
    Antworten: 86
    Letzter Beitrag: 23.06.03, 21:48
  5. ich krieg nixnistalliert!
    Von S3r!0us im Forum System installieren und konfigurieren
    Antworten: 5
    Letzter Beitrag: 08.07.02, 07:45

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •