Datei namex.txt in ordner namex verschieben

Lisa2

Grünschnabel
Beiträge
2
Hallo Leute,

ich bräuchte ein paar Tipps und Anregungen wie ich in einem Verzeichnis, welches gerade so aussieht

n1.txt (Datei)
n2.txt (Datei)
n3.txt (Datei)
n1 (Ordner)
n2 (Ordner)
n3 (Ordner)

es hinbekomme, dass die Dateien in ihre entsprechenden Ordner verschoben werden (also n1.txt --> n1, n2.txt --> n2, n3.txt --> n3). Ich weiß natürlich nicht, wie die Dateien bzw. Ordner heißen, es muss also vor dem mv geschaut werden, ob es überhaupt Übereinstimmungen gibt.

Vielen Dank schon jetzt für Eure Hilfe.

Schöne Grüße
Lisa2
 
Zuletzt bearbeitet:

marce

Kaiser
Beiträge
1.297
find findet die Dateien
mv bewegt sie
mkdir würde die UVZ anlegen
basename liefert zum Dateinamen mit Endung das Ziel-Verzeichnis (geht auch über bashinternals regex, für den Anfang so aber einfacher)
Schleife drumrum, fertig.
 

Lisa2

Grünschnabel
Beiträge
2
Hallo marce,

vielen Dank für die Antwort.

Ich habe die entsprechenden UVZ zu den Dateien schon angelegt. Ich habe also Datei1.txt und Ordner Datei1. Ich brauche jetzt noch einen Befehl, der bei jeder Übereinstimmung die Dateien in die jeweiligen UVZe verschiebt, also Datei1.txt in das UVZ Datei1 - Datei2.txt nach Datei2. Ich kenne aber die Namen der Dateien und Ordner nicht.

Schöne Grüße
Lisa2
 

tgruene

Routinier
Beiträge
418
Schau doch mal, ob Dir der Befehl
Code:
 basename n1.txt .txt
da nicht weiterhilft - darauf wollte marce u.a. hinaus.
 

bitmuncher

Foren Gott
Beiträge
3.180
Wenn man es kryptisch mag. ;)

Code:
perl -e '@files = glob("./*"); foreach $f (@files) { if($f =~ /^(.*)\.txt/) { $cmd = "mv ".$f." ".$1; print $cmd."\n"; $out = `$cmd`; print $out if $out; } }'

Erklärung:
@files = glob("./*"); <- Inhalt des Ordners './' (also aktueller Ordner) in das Array @files einlesen.
foreach $f (@files) { <- einmal durch das Array laufen, aktuelles Element landet in $f
if($f =~ /^(.*)\.txt/) { <- prüfen ob das aktuelle Element dem Schema *.txt entspricht und den Teil vor dem .txt in $1 ablegen
$cmd = "mv ".$f." ".$1; <- Befehl zusammenbauen (mv foobar.txt foobar)
print $cmd."\n"; <- Befehl anzeigen (kann man natürlich auch weglassen
$out = `$cmd`; <- Befehl ausführen und Output in $out für eventuelle weitere Verarbeitung ablegen (Backticks beachten!)
print $out if $out; <- Output ausgeben, falls es welchen gab

Sicherlich gibt es einfachere Wege wie mmv (Multi-MoVe), aber ich denke an diesem Beispiel wird gleich auch klar, was ein Skript für diese Aufgabe tun muss. (Für den Fall, dass man sowas häufiger mal braucht.)
 

Ähnliche Themen

Shell-Script zum auslesen von Dateien aus versch. Verzeichnissen

Sourcen von Dateien / Verzeichnissen

Samba und korrupte Dateien

Server-Monitoring mit RRDTool

Oben