Jak przenieść wiele różnych podfolderów o jeden poziom w dół?

0

Mam DUŻĄ liczbę plików w następującej strukturze: wszystkie pliki w / base /, następnie 4 foldery z 2 „losowymi” literami, a następnie szereg powiązanych ze sobą plików.

Przykład:

/base/ab/12/13/37/file1.txt
/base/ab/12/13/37/file2.txt
/base/ab/12/13/37/file3.txt
/base/cd/b8/e2/a1/other1.txt
.... 
/base/cd/b8/e2/a1/other52.txt
/base/af/f3/45/9e/third1.txt
/base/af/f3/45/9e/third2.txt

itp

Chcę zachować większość struktury, ale na końcu dodaj jeden DODATKOWY (dodatkowy_folder) folder, do którego należą moje pliki. Tak, aby powyższe zostało zmienione na:

/base/ab/12/13/37/extra_folder/file1.txt
/base/ab/12/13/37/extra_folder/file2.txt
/base/ab/12/13/37/extra_folder/file3.txt
/base/cd/b8/e2/a1/extra_folder/other1.txt

Oczekuję, że będę potrzebował skryptu powłoki i polecenia move.

Dziękuję Ci bardzo.

Nixxon
źródło
1
Tak, potrzebujesz skryptu. Można spróbować zrobić coś, prawdopodobnie w oparciu o for, sedi / lub find, i wrócić do nas nie powinno być żadnego problemu z tym?
Shlublu,

Odpowiedzi:

0

Od tego zaczynamy:

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- third1.txt
|               `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                |-- other1.txt
                `-- other52.txt

12 directories, 7 files

Najpierw dodajemy nowe katalogi:

$ find base -type d -mindepth 4 -maxdepth 4 -exec mkdir {}/extra_folder ';'

Używamy obu -mindepth 4i -maxdepth 4do tworzenia nowych katalogów tylko na poziomie czwartym. Bez nich -mindepth 4otrzymalibyśmy nowe katalogi na wyższych poziomach, a bez -maxdepth 4nowych katalogów sami zapełniłyby się nowymi katalogami, dopóki nazwy ścieżek findnie stałyby się tak długie, że nie byłby już w stanie stworzyć więcej.

extra_folderKatalog jest tworzony z mkdirwywoływana z -exec. Teraz mamy

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               |-- extra_folder
|               |-- file1.txt
|               |-- file2.txt
|               `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               |-- extra_folder
|               |-- third1.txt
|               `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                |-- extra_folder
                |-- other1.txt
                `-- other52.txt

15 directories, 7 files

Następnie przeniesiemy pliki w dół:

$ find base -maxdepth 5 -type f -execdir mv {} extra_folder ';'

Wyszukuje każdy zwykły plik w katalogu lub pod basekatalogiem (zakładam, że istnieją pliki tylko na najniższym poziomie), które znajdują się na poziomie piątym. Następnie używa polecenia -execdirdo uruchomienia mvpolecenia w katalogu, w którym znajduje się znaleziony plik ( {}będzie to nazwa bazowa znalezionego pliku).

Skończyliśmy z

$ tree base/
base/
|-- ab
|   `-- 12
|       `-- 13
|           `-- 37
|               `-- extra_folder
|                   |-- file1.txt
|                   |-- file2.txt
|                   `-- file3.txt
|-- af
|   `-- f3
|       `-- 45
|           `-- 9e
|               `-- extra_folder
|                   |-- third1.txt
|                   `-- third2.txt
`-- cd
    `-- b8
        `-- e2
            `-- a1
                `-- extra_folder
                    |-- other1.txt
                    `-- other52.txt

15 directories, 7 files

Za jednym razem:

$ find base -type f \
    -execdir sh -c '[ ! -d "$1" ] && mkdir "$1"; mv "$2" "$1"' sh 'extra_folder' {} ';'

Znajduje wszystkie zwykłe pliki i przenosi je do katalogu o nazwie extra_folderniezależnie od tego, od czego mają zacząć. Kilkukrotne uruchomienie tego polecenia spowoduje ich przesunięcie w dół.

Mini-skrypt wywoływany przez -execdir:

[ ! -d "$1" ] && mkdir "$1"
mv "$2" "$1"

Zostanie to wywołane z nazwą folderu as $1iz nazwą pliku as $2i utworzy folder, jeśli nie istnieje, a następnie przeniesie do niego plik.

Kusalananda
źródło
Testowałem pierwsze polecenia. Trzeba to zrobić w dwóch krokach, ale wydają się działać :) Dziękuję.
Nixxon