Linux: Verschieben Sie Dateien aus einem unbekannten Ordner in einen unbekannten übergeordneten Ordner des gleichen unbekannten Ordners

369
Peter

Haben Sie mit diesem Titel auf sich aufmerksam gemacht? LOL.

Problem: Ich habe viele Ordner, in denen sich ein Ordner mit Dateien befindet. Ich möchte die Dateien der zweiten Ebene in die erste Ebene verschieben, ohne deren Namen zu kennen.

Grafisch gesehen, was ich will:

Aktuell:

new └── temp ├── Folder1 │ ├── SubFolder1 │ │ └── SubTest1.txt │ └── Test1.txt ├── Folder2 │ ├── SubFolder2 │ │ └── SubTest2.txt │ └── Test2.txt └── Folder3 ├── SubFolder3 │ └── SubTest3.txt └── Test3.txt 

Gewünscht:

└── temp ├── Folder1 │ ├── SubFolder1 │ ├── SubTest1.txt │ └── Test1.txt ├── Folder2 │ ├── SubFolder2 │ ├── SubTest2.txt │ └── Test2.txt └── Folder3 ├── SubFolder3 ├── SubTest3.txt └── Test3.txt 

Wenn Sie Lust haben wollten, was ich später nicht tun muss, entferne ich leere Dateien, aber es ist erwähnenswert, dass ich noch mehr lernen kann:

└── temp ├── Folder1 │ ├── SubTest1.txt │ └── Test1.txt ├── Folder2 │ ├── SubTest2.txt │ └── Test2.txt └── Folder3 ├── SubTest3.txt └── Test3.txt 

Ich komme sehr nahe, aber mir fehlt etwas und ich bin sicher, dass es einfach / dumm ist. Hier ist was ich laufe:

 find . -mindepth 3 -type f -exec sh -c 'mv -i "$1" "$"' sh {} \; 

Hier ist was ich bekomme:

mv: './1stlevel/2ndlevel/test.rtf' and './1stlevel/2ndlevel/test.rtf' are the same file 

Bei Stack Overflow brachte George mich näher, indem er mir gab:

find . -mindepth 4 -type f -exec mv {} ./*/* \; 

ebenso gut wie:

mv ./*/*/*/* ./*/* 

Der Befehl mv ist sicher der richtige Weg, da er sauberer und viel, viel schneller ist. Aber obwohl es mit einem Ordner gut funktioniert, wird es bei mehreren Ordnern so:

new └── temp └── Folder3 ├── Folder1 │ ├── SubFolder1 │ └── Test1.txt ├── Folder2 │ ├── SubFolder2 │ └── Test2.txt ├── SubFolder3 ├── SubTest1.txt ├── SubTest2.txt ├── SubTest3.txt └── Test3.txt 

Ich komme also näher, aber nicht ganz dort. Irgendwelche Vorschläge? Danke im Voraus!

0
[Ist das Cross-Posting einer Frage auf mehreren Stack Exchange-Sites zulässig, wenn die Frage für jede Site thematisiert ist?] (Https://meta.stackexchange.com/a/64069/132956) Steven vor 6 Jahren 0
Schlägt mich aber die Seite, auf der ich es ursprünglich gepostet hatte, sprang jemand auf mich und sagte, ich solle es hier stellen. Seufz ... Alles was ich will ist eine verdammte Hilfe. Peter vor 6 Jahren 0
Ich stimme zu, um diese Frage als Off-Topic zu schließen, da sie [auf SO] (https://stackoverflow.com/q/49968420) und [es sollte nicht] (https: // meta.) .stackexchange.com / a / 64069/132956). Im Moment wird die Frage dort (mit einer bereits bestätigten Antwort) angehoben, hier heruntergewählt. Kamil Maciorowski vor 6 Jahren 2
Ja, während es wahrscheinlich auf SU mehr als auf SO gehört, hat es dort eine gute Antwort und Argumente darüber, wo Dinge akademisch werden. Seien Sie nicht entmutigt, bitte, Peter, durch diese offensichtliche Auseinandersetzung: Der Zweck verschiedener Sites mit unterschiedlichen On-Themes besteht darin, Gemeinschaften zu fördern, die thematisch und mächtig zu diesen Themen sind. Überqueren Sie also bitte nicht in der Zukunft, aber SU ist wahrscheinlich der beste Ort, um eine Frage zu stellen, wenn Sie nicht sicher sind, wohin sie gehen soll, weil wir zu den generischeren SE-Standorten gehören. music2myear vor 5 Jahren 1
Vielen Dank @ music2myear für Ihren Kommentar. Ich weiß es zu schätzen, da ich zugeben muss, dass mich die ganze Situation wirklich entmutigt hat. Glücklicherweise hat George mir eine großartige Antwort gegeben, und G-Man hat eine andere Möglichkeit, dies zu tun, die mir auch einen guten Tipp zur zukünftigen Fehlerbehebung gab. Zwischen euch beiden ist mein Glaube wiederhergestellt worden. Sich kümmern! Peter vor 5 Jahren 1

1 Antwort auf die Frage

1
Peter Moore

Sie können eine for-Schleife verwenden, um dies zu vereinfachen. ich habe den dirennamen $ tiem / .. verwendet, um eine Ebene nach oben zu bringen, und den Mindepth, um den Effekt auf eine Ebene zu begrenzen.

localhost$ tree . └── temp ├── folder1 │   ├── subfolder1 │   │   └── file1 │   └── test1.txt ├── folder2 │   ├── subfolder2 │   │   └── file2 │   └── test2.txt └── folder3 ├── subfolder3 │   └── file3 └── test3.txt  7 directories, 6 files /tmp/foo/new  localhost$ for item in `find . -mindepth 4 -type f`; do echo $item `dirname $item`/..; done ./temp/folder1/subfolder1/file1 ./temp/folder1/subfolder1/.. ./temp/folder3/subfolder3/file3 ./temp/folder3/subfolder3/.. ./temp/folder2/subfolder2/file2 ./temp/folder2/subfolder2/.. 

Nach dem Umzug wird es

localhost$ for item in `find . -mindepth 4 -type f`; do mv $item `dirname $item`/..; done /tmp/foo/new localhost$ tree . └── temp ├── folder1 │   ├── file1 │   ├── subfolder1 │   └── test1.txt ├── folder2 │   ├── file2 │   ├── subfolder2 │   └── test2.txt └── folder3 ├── file3 ├── subfolder3 └── test3.txt  7 directories, 6 files /tmp/foo/new  localhost$ 

Hoffentlich hilft das.