Linux: déplacer des fichiers d'un dossier inconnu vers un parent inconnu du même dossier inconnu

0

Vous avez attiré votre attention avec ce titre, n'est-ce pas? LOL.

Problème: j'ai beaucoup de dossiers qui ont un dossier à l'intérieur, avec des fichiers à l'intérieur. Je souhaite déplacer les fichiers de niveau 2 vers le niveau 1 sans le savoir.

Graphiquement, voici ce que je veux:

Actuel:

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

Voulu:

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

Si on veut avoir envie, ce que je n'ai pas besoin de faire car plus tard dans mon script, je supprime les fichiers vides, mais il convient de le mentionner au cas où je pourrais en apprendre encore plus:

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

Je deviens très proche mais il me manque quelque chose et je suis sûr que c'est simple / stupide. Voici ce que je cours:

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

Voici ce que ça me procure:

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

Sur Débordement de pile , George m'a rapproché en me donnant:

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

aussi bien que:

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

La commande mv est la voie à suivre, car elle est plus propre et beaucoup plus rapide. Mais hélas, bien que cela fonctionne très bien avec un dossier, plusieurs dossiers le transforment en ceci:

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

Donc, je me rapproche mais pas tout à fait là. Aucune suggestion? Merci d'avance!

Peter
la source
Ca me bat, mais le site sur lequel je l’ai posté à l’origine, quelqu'un m'a sauté dessus et a dit de le mettre ici. Alors, soupir ..... Tout ce que je veux, c'est une aide sanglante.
Peter
2
Je vote pour fermer cette question comme hors sujet parce que cela a été cross-posté sur SO tandis que ça n'aurait pas dû . Pour le moment, la question est votée ici (avec une réponse déjà votée), votée ici.
Kamil Maciorowski
1
Oui, alors que probablement fait parti ici sur SU plus que sur SO, il y a une bonne réponse, et les arguments pour savoir où les choses vont aller deviennent académiques. Ne soyez pas découragé, Peter, par cette apparente querelle: le but de différents sites avec différents sujets est de susciter des communautés qui sont à la fois puissantes et sur ces sujets. Donc, ne postez pas de messages à l'avenir, s'il vous plaît, mais SU est probablement le meilleur endroit pour poser une question si vous n'êtes pas sûr de l'endroit où il convient d'aller car nous sommes l'un des sites les plus génériques des sites SE.
music2myear
1
Merci, @ music2myear, pour votre commentaire. Je l’apprécie, car j’admettrai que j’étais vraiment découragé par la situation dans son ensemble. Heureusement, George m'a donné une excellente réponse et G-Man, une autre façon de le faire, m'a également fourni un bon conseil pour le dépannage futur. Entre vous trois, ma foi a été restaurée. Prends soin!
Peter

Réponses:

1

Vous pouvez utiliser une boucle for pour simplifier cela. J'ai utilisé le dirname $ time / .. pour obtenir un niveau et le maxdepth pour limiter l'effet à un niveau.

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/..

Après le déménagement, il devient

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$

J'espère que cela pourra aider.

Peter Moore
la source