Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Script zum Löschen von bestimmten Dateien

Frage Entwicklung Perl

Mitglied: skip123

skip123 (Level 1) - Jetzt verbinden

16.09.2008, aktualisiert 17.09.2008, 5842 Aufrufe, 10 Kommentare

Hallo zusammen !

es geht um folgenden sachverhalt: wir haben hier ein linux system auf dem bestimmte dateien verschoben werden sollen.... diese dateien liegen mir anhand einer liste vor.
(pro zeile ein dateiname)

da das verzeichnis gefühlte 1000 unterordner hat (also rekursiv müsste die suche auf jedenfall sein) und das ca. 700 dateien sind, die verschoben werden müssten kann sich ja sicherlich jeder
vorstellen wie lange das dauern würde.

meine frage ist deshalb ob es irgendein script oder befehl gibt, das diese dateinamen aus der mir vorliegenden datei zeile für zeile überprüft, sucht und dann an einen
bestimmten platz verschiebt ?

mit linux ist doch so gut wie alles möglich

mit freundlichen grüßen
skip123
Mitglied: theton
16.09.2008 um 09:21 Uhr
Das ist mit jeder beliebigen Skript-Sprache möglich. In Perl z.B.

01.
#!/usr/bin/perl 
02.
 
03.
my $filename = "thisfile.txt"; # unsere datei mit der liste 
04.
# datei zum lesen oeffnen 
05.
open(HANDLE, "< $filename") or die "Couldn't open file '$filename' for reading!\n"; 
06.
# datei zeilenweise einlesen 
07.
while($line = <HANDLE>) { 
08.
    # tu etwas mit dieser Zeile, z.B. die Datei verschieben 
09.
    chomp($line); # zeilenumbruch entfernen 
10.
    $out = `mv $line /mein/neuer/platz`; 
11.
    # ggf Output ausgeben 
12.
    if($out) { 
13.
        print $out."\n"; 
14.
15.
16.
# datei schliessen 
17.
close(HANDLE);
Bitte warten ..
Mitglied: skip123
16.09.2008 um 09:51 Uhr
das ging ja schnell hätte garnicht mit so einer zügigen antowort gerechnet....

vielen dank schon mal

aber kann es sein das das script nur funktioniert wenn sich alle dateien in einem ordner befinden ? das ist bei uns aber nicht der fall.
sind zwar im prinzip in einem ordner aber der ist nochmal in tausende unterordner unterteilt, worin sich letztendlich dann die gesuchten dateien befinden...

gibt es da noch ne möglichkeit das ganze vielleicht rekursiv zu machen..
Bitte warten ..
Mitglied: theton
16.09.2008 um 09:56 Uhr
Nimm einfach anstatt dem mv-Befehl einen find-Befehl der die Dateien sucht und dann mittels des Parameters '-exec' verschiebt. Siehe dazu 'man find'.
Bitte warten ..
Mitglied: skip123
16.09.2008 um 10:35 Uhr
sorry aber ich komm immernoch nicht so richtig weiter

versuche die ganze zeit find und exec einzubauen aber immer kommt ne fehlermeldung

01.
#!/usr/bin/perl 
02.
my $filename = "test.txt"; # unsere datei mit der liste 
03.
# datei zum lesen oeffnen 
04.
open(HANDLE, "< $filename") or die "Couldn't open file '$filename' for reading!\n"; 
05.
# datei zeilenweise einlesen 
06.
while($line = <HANDLE>) { 
07.
    # tu etwas mit dieser Zeile, z.B. die Datei verschieben 
08.
    chomp($line); # zeilenumbruch entfernen 
09.
    $out = `find $line -exec mv /root/hiersolltenjetztdateiensein`; 
10.
    # ggf Output ausgeben 
11.
    if($out) { 
12.
        print $out."\n"; 
13.
14.
15.
# datei schliessen 
16.
close(HANDLE);
die fehlermeldung lautet:
01.
find: missing argument to `-exec'
Bitte warten ..
Mitglied: theton
16.09.2008 um 10:45 Uhr
01.
find /oberordner/der/dateien/ -name $line -exec mv {} /zielordner
So sollte der Befehl funktionieren. Keine Garantie. Beispiele finden sich aber bestimmt auch im Netz.
Bitte warten ..
Mitglied: skip123
16.09.2008 um 13:22 Uhr
sorry das ich hier so nerven muss aber ich bekomm es einfach nicht hin:

hab nun immerhin schon rausgefunden das der befehl wie folgt funktioniert wenn ich ihn anhand von ein paar testdateien und ordnern teste:

01.
find /test -name "test1" -exec mv {} /tempo \;
oder so
01.
find /test -name "test1" -exec bash -c "mv {} /tempo" \;
wie gesagt, so funktioniert der befehl, wenn ich diesen befehl allerdings in das script oben einbaue funktioniert er nicht ? wie kann das sein ?

script sieht zur zeit so aus:
01.
#!/usr/bin/perl 
02.
 
03.
my $filename = "test.txt"; # unsere datei mit der liste 
04.
# datei zum lesen oeffnen 
05.
open(HANDLE, "< $filename") or die "Couldn't open file '$filename' for reading!\n"; 
06.
# datei zeilenweise einlesen 
07.
while($line = <HANDLE>) 
08.
09.
    # tu etwas mit dieser Zeile, z.B. die Datei verschieben 
10.
    find /test -name $line -exec bash -c "mv {} /tempo" \; 
11.
 
12.
13.
# datei schliessen 
14.
close(HANDLE);
fehlermeldung:
01.
Backslash found where operator expected at ./delete line 10, near ""mv {} /tempo" \" 
02.
        (Missing operator before  \?) 
03.
syntax error at ./delete line 10, near ""mv {} /tempo" \" 
04.
Execution of ./delete aborted due to compilation errors.
wäre echt super wenn einer ne lösung weiß.... bin fast am verzweifeln

Mit freundlichen Grüßen skip123
Bitte warten ..
Mitglied: theton
16.09.2008 um 13:46 Uhr
Du musst den Befehl schon als Perl-Code einbinden. D.h. dass z.B. Anführungsstriche escaped werden müssen und dass der gesamte Befehl beim Ausführen in Backticks eingeschlossen werden muss. Beispiel:

01.
$command = "befehl --mit \"parametern\""; $out = `$command`;
Im Skript könnte das also z.B. so aussehen:

01.
#!/usr/bin/perl 
02.
my $filename = "test.txt"; # unsere datei mit der liste 
03.
# datei zum lesen oeffnen 
04.
open(HANDLE, "< $filename") or die "Couldn't open file '$filename' for reading!\n"; 
05.
# datei zeilenweise einlesen 
06.
while($line = <HANDLE>) { 
07.
    # tu etwas mit dieser Zeile, z.B. die Datei verschieben 
08.
    chomp($line); # zeilenumbruch entfernen 
09.
    $command = "find /test -name \"$line\" -exec mv {} /tempo"; 
10.
    $out = `$command`; 
11.
    # ggf Output ausgeben 
12.
    if($out) { 
13.
        print $out."\n"; 
14.
15.
16.
# datei schliessen 
17.
close(HANDLE);
Bitte warten ..
Mitglied: skip123
16.09.2008 um 15:39 Uhr
ok... lange störe ich nicht mehr... bin nämlich kurz vorm aufgeben:

script sieht zur zeit wie folgt aus:

01.
#!/usr/bin/perl 
02.
 
03.
my $filename = "test.txt"; # unsere datei mit der liste 
04.
# datei zum lesen oeffnen 
05.
open(HANDLE, "< $filename") or die "Couldn't open file '$filename' for reading!\n"; 
06.
# datei zeilenweise einlesen 
07.
while($line = <HANDLE>) 
08.
09.
        # tu etwas mit dieser Zeile, z.B. die Datei verschieben 
10.
        chomp($line); # zeilenumbruch entfernen 
11.
        $command = "find /test -name \"$line\" -exec mv {} /tempo"; 
12.
        $out = `$command`; 
13.
        # ggf Output ausgeben 
14.
        if($out) 
15.
16.
                print $out."\n"; 
17.
18.
19.
# datei schliessen 
20.
close(HANDLE);
fehlermeldung:
01.
find: missing argument to `-exec'
das ist die gleiche fehlermeldung die ich erhalte, wenn ich den befehl einzeln wie folgt ausführen würde:
01.
find /test -name "test1" -exec mv {} /tempo;
Grund: "\" fehlt, Befehl muss also wie folgt aussehen:
01.
find /test -name "test1" -exec mv {} /tempo \;
wenn ich diesen backslash jetzt oben einbauen will, "denkt" der rechner sicherlich das ich ein ausführungszeichen escapen will, da die zeile ja wie folgt enden würde:
01.
$command = "find /test -name \"$line\" -exec mv {} /tempo \"; 
führe ich das script mit der abgeänderten zeile aus, kommen gleich noch mehr fehlermeldungen:
01.
Backslash found where operator expected at ./delete line 16, near "print $out."\" 
02.
  (Might be a runaway multi-line "" string starting on line 11) 
03.
        (Do you need to predeclare print?) 
04.
String found where operator expected at ./delete line 19, near "# find /test -name $line -exec bash -c "" 
05.
  (Might be a runaway multi-line "" string starting on line 16) 
06.
        (Missing semicolon on previous line?) 
07.
Bareword found where operator expected at ./delete line 19, near "# find /test -name $line -exec bash -c "mv" 
08.
        (Missing operator before mv?) 
09.
syntax error at ./delete line 16, near "print $out."\" 
10.
Search pattern not terminated at ./delete line 19.
So. und meine allerletzte frage: wenn ich mir den find befehl so angucke müsste dann nicht die variable ($line) OHNE anführungszeichen sein, also:
01.
$command = "find /test -name $line -exec mv {} /tempo \"; 
da er ja sonst nach dem wort "$line" sucht und nicht nach dem inhalt der variablen ?

sorry für den ganzen stress
Mit freundlichen Grüßen
skip123
Bitte warten ..
Mitglied: theton
16.09.2008 um 16:08 Uhr
Auch Backslashes kann man als Escape-Sequenz einfügen. Will man also ein einzelnes Backslash im String haben, schreibt man einfach '\\'. Ob der Dateiname in Anführungsstrichen steht, dürfte find eigentlich egal sein. Da du sie in deinem find-Befehl drin hast, hab ich sie auch einfach mal mit reingenommen. Der Befehl

01.
find /test -name "test1" -exec mv {} /tempo \;


Muss als Perl-String also so aussehen:

01.
"find /test -name \"test1\" -exec mv {} /tempo \\;"
Im Übrigen sind Nachfragen kein Problem. Dafür sind wir ja hier. Also nicht gleich aufgeben.
Bitte warten ..
Mitglied: skip123
17.09.2008 um 08:45 Uhr
So. Endlich funktionierts !

Nochmal ein ganz großes Dankeschön an theton ! Ohne dich hätte ich das echt nie geschafft !

Aber in Zukunft weiß ich ja, wo ich meine Fragen stellen kann.

EDIT:

sorry aber ich muss das thema doch nochmal aufgreifen die anforderungen an das script sind jetzt noch kurzfristig gewachsen

erstmal die problembeschreibung: der ordner der durchsucht wird enthält (wie schon erwähnt) sehr viele unterordner, welche ebenfalls wieder unterordner enthalten. die dateien die von dem script gesucht werden kommen in mehreren dieser unterordner vor.

das script verschiebt zurzeit ja alle dateien in einen von mir definierten ordner und überschreibt dann natürlich die dateien, die sie aus einem zuvor schon gefundenen unterordner verschoben hat. ergebnis: im durchsuchten ordner gab es die datei "xyzabc" merhmals (da in verschiedenen unterordnern vorhanden) aber in dem verzeichnis wo alle dateien hingeschoben werden ist die datei "xyzabc" jetzt nur noch einmal vorhanden, da sie mehrmals überschrieben wurde.

meine vorstellung wäre jetz: jedesmal wenn per find eine gesuchte datei gefunden wird, "merkt" sich das script den aktuellen ordner durch das speichern der ausgabe von pwd und verschiebt dann die datei in ordner "xyz" mit dem unterordner namens "pwdausgabe" (so das jede datei ihren unterordner den sie davor schon hatte im neuen verzeichnis auch hat)

*puh* ich hoffe das wäre irgendwie machbar.. hab da leider absolut keine idee :/

EDIT2:

Habs doch noch selber hinbekommen. ist jetzt zwar etwas umständlicher gelöst, aber naja
sind jetz 2 scripte statt einem, aber egal.

für alle interessierten poste ich mal noch die 2 scripte:

also das 1. script sieht wie folgt aus:
01.
#!/usr/bin/perl 
02.
my $filename = "test.txt"; # unsere datei mit der liste 
03.
# datei zum lesen oeffnen 
04.
open(HANDLE, "< $filename") or die "Couldn't open file '$filename' for reading!\n"; 
05.
# datei zeilenweise einlesen 
06.
while($line = <HANDLE>) { 
07.
        # tu etwas mit dieser Zeile, z.B. die Datei verschieben 
08.
        chomp($line); # zeilenumbruch entfernen 
09.
        $command = "find /test -name $line >> found.txt;"; 
10.
        $out = `$command`; 
11.
        # ggf Output ausgeben 
12.
        if($out) 
13.
14.
                print $out."\n"; 
15.
16.
17.
# datei schliessen 
18.
close(HANDLE);
und das 2. script:
01.
#!/usr/bin/perl 
02.
my $filename = "found.txt"; # unsere datei mit der liste 
03.
# datei zum lesen oeffnen 
04.
open(HANDLE, "< $filename") or die "Couldn't open file '$filename' for reading!\n"; 
05.
# datei zeilenweise einlesen 
06.
while($line = <HANDLE>) { 
07.
        # tu etwas mit dieser Zeile, z.B. die Datei verschieben 
08.
        chomp($line); # zeilenumbruch entfernen 
09.
        $command = "cp $line /tempo$line"; 
10.
        $out = `$command`; 
11.
        # ggf Output ausgeben 
12.
        if($out) 
13.
14.
                print $out."\n"; 
15.
16.
17.
# datei schliessen 
18.
close(HANDLE);
Nochmal einen wirklich FETTEN dank an theton.... ohne sein script als vorlage hätte ich das nicht geschafft !

Mit freundlichen Grüßen skip123
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...