Linux Shell Dateien in verschiedene Ordner sortieren

...komplette Frage anzeigen

1 Antwort

solche Aufgaben löse ich nicht mit der sh- oder bash- Shell. Das geht mit der tclsh-Shell viel besser. Wenn du die installiert hast, bei OpenSuse gehört das zum Standard, bei anderen muss sie u.U. noch installiert werden, dann schreibe die Zeilen in eine Datei, mache sie mit chmod ausführbar. Ich habe Fehleingaben nicht großartig abgefangen!!! Beim Aufruf ohne Parameter wird ein Hilfetext angezeigt

#!/bin/bash 
# \
exec tclsh "$0" "$@"

puts "Benutzung: $argv0 Quell-Verzeichnis Zielverzeichnis Datei-Stamm-Name Schlüsselwort "
puts "Dieses Programm dursucht alle Dateien mit dem Datei-Stamm-Name ( .* ) im Quell-Verzeichnis"
puts "nach dem angegebenen Schlüsselwort (getrennt durch Leereichen) "
puts "und veschiebt die gefundenen Dateien in das Zielverzeichnis\n"


set quellverzeichnis [lindex $argv 0 ]
set zielverzeichneis [lindex $argv 1 ]
set name [lindex $argv 2 ]
set keywort [lindex $argv 3 ]

if { $quellverzeichnis == "" || $zielverzeichneis == "" || $name == "" || $keywort == "" } return


proc grep { file key } {
     set fp [ open $file r ]
     while { ![eof $fp ] } { set list [split [gets $fp ] ]
                             set length [llength $list ]
                             set i 0
                             while { $i < $length } { if { [lindex $list $i ] == $key } { close $fp ; return "found" }
                                                      incr  i
                                                     }
                            }
      close $fp ; return "missing"
      }




set i 0

foreach x [glob -nocomplain $quellverzeichnis/$name.* ] { if { [grep $x $keywort  ] == "found" } { file rename $x $zielverzeichneis/[file tail $x]
                                                                                                    puts "Datei $x  nach $zielverzeichneis  verschoben"
                                                          incr i
                                                          }
                                             }

puts "Beendet: $i Dateien mit Schlüsselwort \"$keywort\" gefunden und nach \"$zielverzeichneis\" verschoben"
Maxi5001 27.11.2013, 14:17

Danke für die ausführliche Antwort mit Beispiel Code.

Ich habe es mal getestet, aber leider kommen Fehlermeldungen:

error reading "file3": illegal operation on a directory
    while executing
"gets $fp "
    (procedure "grep" line 3)
    invoked from within
"grep $x $keywort  "
    ("foreach" body line 1)
    invoked from within
"foreach x [glob -nocomplain $quellverzeichnis/$name.* ] { if { [grep $x $keywort  ] == "found" } { file rename $x $zielverzeichnis/[file tail $x]
    ..."
    (file "./sortieren.sh" line 36)

Als kleine Hilfe, das Verzeichnis sieht aktuell so aus:

linuxsystem=host:~/sandbox > ls
file.1.1  file.1.2  file.1.3  file.1.4  file.1.5  apfel  sortieren.sh  birne
0
guenterhalt 27.11.2013, 16:50
@Maxi5001

wie schon geschrieben, habe ich keine Maßnahmen gegen Fehleingaben eingebaut.

Da wird versucht ein Verzeichnis zu öffnen, was aber nicht erlaubt ist. Füge bitte die folgende Zeile hinter

prog grep { .... }

ein:

 if { ![file isfile $file ]} { return "missing" }    

Möglicherweise kann die Shell auch die Tilde (~ ) nicht auflösen. Ersetze die bitte durch $HOME

scrip  $HOME/sandbox  $HOME/<dasZielVerzeichnis> file  <Schlüsselwort> 
0
Maxi5001 28.11.2013, 10:52
@guenterhalt

Tut mir leid, ich check das einfach nicht :( Aber du kennst dich wohl auch in Bash aus, ich habe nun PHP Code in Bash Stück für Stück übersetzt und nun liegt es nur noch an einer Funktion in einer If Schleife:

#! /bin/bash -x

#Variablen Deklaration start
declare -a array;                               #Keywordindizierung
array=([keywords]='Apfel' 'Birnen')

APFEL="/home/ich/sandbox/apfel/"               #Pfad für Apfel
BIRNEN="/home/ich/sandbox/birnen/"      #Pfad für Birnen
#Variablen Deklaration ende

find file.1.* > dateiliste.txt

for fn in `cat dateiliste.txt`; do
        for keywords in ${!array[@]}; do
                if [durchsuchfunktion($fn, $keywords) == gefunden]
                   mv $datei $APFEL
                then
                   mv $datei $BIRNE
                fi
        done
done

Ich habe grade nicht so die Idee wie ich das: if [durchsuchfunktion($fn, $keywords) == gefunden]

so übersetze, dass er nun folgendes tut: if [$keywords gefunden in $fn]

Möglich müsste noch sein, das in Zukunft die If Schleife erweiterbar ist, denn bald könnten noch z.B. "Orangen" und "Pflaumen" dazu kommen.

Herzlichen Dank soweit für deine Hilfe, vielleicht kannst du mir noch hierbei helfen

0
Maxi5001 28.11.2013, 11:10
@Maxi5001

Der letzte Kommentar ist schon wieder veraltet. Nun funktioniert es, aber beim If ist etwas noch nicht so richtig.

Dort verschiebt er nun jede Datei ob sie das Keyword enthält oder nicht.

    for fn in `cat dateiliste.txt`; do
        for keywords in ${!array[@]}; do
                if [ "$fn" == "$keywords" ]; then
                   mv $fn $APFEL
                else
                   mv $fn $BIRNEN
                fi
        done
done
0

Was möchtest Du wissen?