verschieben von files im unterordner

xqq

Well-Known Member
Hallo Board,

Ich suche einen befehl der dateien in einem ordner in einen anderen verschiebt.
jedoch:

Ich habe einen Ordner like this:
/var/directory/directory/$ORDNER/dir1
/var/directory/directory/$ORDNER/dir2
/var/directory/directory/$ORDNER/dir3

Ich möchte das alle files in den ordner dir1, dir2 und dir 3 nach

/var/directory/$ORDNER/dir1
/var/directory/$ORDNER/dir2
/var/directory/$ORDNER/dir3

verschoben werden $ORDNER ist variable(!?) das heisst es gibt mehrere Ordner in /var/directory/directory mit der gleichen struktur nach dem $ORDNER/

und wenn möglich sollen die files dann alle ein "chown -R blub:blub" erhalten.

Zur zeit handhabe ich das mit einem:
find . -name "*textwelcherjederdateinameenthaelt*" -exec mv {} /var/directory/$ORDNER/dir1 \;

usw. sehr anstrengend.

achja ich verwende die zsh.

--
Ich kann leider nicht besser erklären was ich meine :)
 
Code:
cd /var/directory/ && mv directory/$ORDNER .
Kann es sein das das alles ist was du machen willst?
So ganz genau kann ich dir nämlich nicht folgen
 
nein weil
$ORDNER/dir1/* nach ../$ORDNER/dir1/*
$ORDNER/dir2/* nach ../$ORDNER/dir2/*
$ORDNER/dir3/* nach ../$ORDNER/dir3/*

$ORDNER2/dir1/* nach ../$ORDNER2/dir1/*
$ORDNER2/dir2/* nach ../$ORDNER2/dir2/*
$ORDNER2/dir3/* nach ../$ORDNER2/dir3/*

und das ganze ist ziemlich anstrengend bei ein paar hundert solcher ordner.
... und ein "mv" auf der shell (alleine) funktioniert nicht "Argument list too long"
 
Code:
(16:39:11) elessar@loki: ~/TEST> ls -R
directory

./directory:
directory

./directory/directory:
ordner1 ordner2 ordner3

./directory/directory/ordner1:
dir1    dir2    dir3    dir4

./directory/directory/ordner1/dir1:
file_1  file_2  file_3  file_4

./directory/directory/ordner1/dir2:
file_1  file_2  file_3  file_4

./directory/directory/ordner1/dir3:
file_1  file_2  file_3  file_4

./directory/directory/ordner1/dir4:
file_1  file_2  file_3  file_4

./directory/directory/ordner2:
dir1    dir2    dir3    dir4

./directory/directory/ordner2/dir1:
file_1  file_2  file_3  file_4

./directory/directory/ordner2/dir2:
file_1  file_2  file_3  file_4

./directory/directory/ordner2/dir3:
file_1  file_2  file_3  file_4

./directory/directory/ordner2/dir4:
file_1  file_2  file_3  file_4

./directory/directory/ordner3:
dir1    dir2    dir3    dir4

./directory/directory/ordner3/dir1:
file_1  file_2  file_3  file_4

./directory/directory/ordner3/dir2:
file_1  file_2  file_3  file_4

./directory/directory/ordner3/dir3:
file_1  file_2  file_3  file_4

./directory/directory/ordner3/dir4:
file_1  file_2  file_3  file_4
(16:39:13) elessar@loki: ~/TEST> foreach dir (directory/directory/ordner*)
foreach? mv $dir directory/
foreach? end
(16:39:53) elessar@loki: ~/TEST> ls -R
directory

./directory:
directory       ordner1         ordner2         ordner3

./directory/directory:

./directory/ordner1:
dir1    dir2    dir3    dir4

./directory/ordner1/dir1:
file_1  file_2  file_3  file_4

./directory/ordner1/dir2:
file_1  file_2  file_3  file_4

./directory/ordner1/dir3:
file_1  file_2  file_3  file_4

./directory/ordner1/dir4:
file_1  file_2  file_3  file_4

./directory/ordner2:
dir1    dir2    dir3    dir4

./directory/ordner2/dir1:
file_1  file_2  file_3  file_4

./directory/ordner2/dir2:
file_1  file_2  file_3  file_4

./directory/ordner2/dir3:
file_1  file_2  file_3  file_4

./directory/ordner2/dir4:
file_1  file_2  file_3  file_4

./directory/ordner3:
dir1    dir2    dir3    dir4

./directory/ordner3/dir1:
file_1  file_2  file_3  file_4

./directory/ordner3/dir2:
file_1  file_2  file_3  file_4

./directory/ordner3/dir3:
file_1  file_2  file_3  file_4

./directory/ordner3/dir4:
file_1  file_2  file_3  file_4
(16:39:57) elessar@loki: ~/TEST>
So?
 
Code:
[matze@lodoss ~/test]$ ls -R
directory

./directory:
directory

./directory/directory:
ordner1 ordner2 ordner3

./directory/directory/ordner1:
file_1  file_2  file_3  file_4  file_5

./directory/directory/ordner2:
file_1  file_2  file_3  file_4  file_5

./directory/directory/ordner3:
file_1  file_2  file_3  file_4  file_5
[matze@lodoss ~/test]$ mv directory/directory directory2 && rm -r directory && mv directory2 directory 
[matze@lodoss ~/test]$ ls -R
directory

./directory:
ordner1 ordner2 ordner3

./directory/ordner1:
file_1  file_2  file_3  file_4  file_5

./directory/ordner2:
file_1  file_2  file_3  file_4  file_5

./directory/ordner3:
file_1  file_2  file_3  file_4  file_5
[matze@lodoss ~/test]$
 
die von mir gepostete methode geht auf jeden fall! ich habs ja selbst ausprobiert (das is nich konstruiert, dasn copy+paste aus meiner shell!!!)
 
nein weil erstens kein mv bei mir geht (da kern.argmax zu klein)
und im prinzip is das nix anderes als einfach den ordner zu verschieben, sprich ich müsste das sowieso für jeden ordner wieder extra machen (was ich gerade mache)
und drittens überschreibt sich das ganze dann (afaik).
 
[edit]
vergiss es, ich hab das mit dem "Argument list too long" überlesen.
 
Zuletzt bearbeitet:
ich geb mich geschlagen. ich hab keinen dunst was du eigentlich vor hast.
dein OP sah so aus, als woelltest du alles von /var/directory/directory mit gleicher verzeichnisstruktur in /var/directory haben. genau das bewirken die befehle.

edit: ausser wenn mv nicht funktioniert..
 
nein ich will alles von

/var/directory/directory/NUMMEREINS/bla/*
nach
/var/directory/NUMMEREINS/bla/*

/var/directory/directory/NUMMERZWEI/bla/*
nach
/var/directory/NUMMERZWEI/bla/*

usw. theoretisch einfach jedoch darf sich da nix überschreiben (also ordner) und mit "mv" alleine geht es nicht und es "muss" "automatisch" gehen weil von diese "NUMMEREINS" "NUMMERZWEI" usw usf. ordner gibts genug.

würde ja theo. mit
find . -name "*textwelcherjederdateinameenthaelt*" -exec mv {} /var/directory/NUMMERZWEI/bla/ \;
gehen (gut ein bisschen tricky) aber da muss ich das ganze händisch machen also immer das "NUMMEREINS" "NUMMERZWEI" usw. manuell ändern.
 
Warum sind eigentlich alle immer so scharf auf die find/exec Kompination und pipen das Ganze nicht einfach an xargs?
 
probier mal sowas aus: (keine ahnung ob das so ist wie du willst, solltest deine aufgabe etwas genauer beschreiben..)
Code:
# die verzeichnisse, die als $ORDNER fungieren sollen
DIRS="ordner1 ordner2 ordner3 ordner4"

# hier liegen die $ORDNER
BASEDIR=/var/directory/directory

# hier sollen sie hin
TARGDIR=/var/directory

# hier die maske fuer die dateinamen, * fuer alle
FILENAME="*"

for DIR in $DIRS
do
   # erst verzeichnis erstellen...
   mkdir -p $TARGDIR/$DIR
   # subdirs erstellen
   for SUBDIR in $(find $BASEDIR/$DIR -type d)
   do
      mkdir -p $TARGDIR/$DIR/${SUBDIR#$BASEDIR/$DIR/}
   done
   # dateien aus subdirs verschieben
   for FILE in $(find $BASEDIR/$DIR -type f -name "$FILENAME")
   do
      mv $FILE $TARGDIR/$DIR/${FILE#$BASEDIR/$DIR/}
   done
done

# dateirechte anpassen
chown -R blub:blub $TARGDIR/*

auf bald
oenone

ps: durch deine 'find'-methode benutzt du keine shell, sondern find.
 
nice, genau das wollte ich damit bezwecken :) nur er erstellt bei jedem user ein verzeichnis 'var'?

und kann man eventuell bei DIRS=" " ein wildcard setzen?

danke dir
 
Zuletzt bearbeitet:
xqq schrieb:
nein ich will alles von

/var/directory/directory/NUMMEREINS/bla/*
nach
/var/directory/NUMMEREINS/bla/*

/var/directory/directory/NUMMERZWEI/bla/*
nach
/var/directory/NUMMERZWEI/bla/*
Kann sein, dass ich mir das jetzt zu einfach mach, aber warum zum Henker verschiebst du nicht einfach das NUMMEREINS Verzeichnis?
Code:
mv /var/directory/directory/NUMMEREINS /var/directory
Wenn es da um mehrere Verzeichnisse geht, dann kann man das ja gleich so machen
Code:
cd /var/directory/directory && mv * ..
Schliesslich willst du ja nur alles um ein Verzeichnis tiefer haengen, oder nicht? Ich vestehe nicht warum hier so umstaendlich mit Schleifen gearbeitet wird.
 
weil das _einige_ ordner sind und die unterordner schon mit dateninhalten bestehen und es immer die unterordner sind die verschoben werden bzw der inhalt (nach "NUMMEREINS" usw).
 
Da oenones Skript funktioniert aber meines nicht verwendest du wohl bash. 'foreach' ist tcsh.

Es werden nur immer die Unterverzeichnisse verschoben wenn du /* dranhängst. Lass das weg und verschiebe das Verzeichnis selbst. Solange das Ziel nicht auf einem anderen Dateisystem ist und cp benutzt werden muss ist es absolut egal wie viel in dem Verzeichnis ist.

Code:
(19:28:13) elessar@exxtasy: /jailed/old_webroot> ls -lR | wc -l
  149273
(19:28:59) elessar@exxtasy: /jailed/old_webroot> cd ..
(19:29:52) elessar@exxtasy: /jailed> sudo mv old_webroot test
(19:29:56) elessar@exxtasy: /jailed>
4 Sekunden (inkl. tippen) und kein "argument list too long".
Code:
(19:32:57) elessar@exxtasy: /jailed/test> find . -type d | wc -l
    4557
(19:33:21) elessar@exxtasy: /jailed/test> find . -type f | wc -l
  132577
(19:34:16) elessar@exxtasy: /jailed/test>
Zu wenige Verzeichnisse oder Dateien werdens wohl nicht sein... :huth:
 
Zuletzt bearbeitet:
Zurück
Oben