Тебя привлекло это название, не так ли? ЛОЛ.

Проблема: у меня много папок, в которых есть папка, с файлами внутри. Я хочу переместить файлы 2-го уровня на 1-й уровень и сделать это, не зная их имен.

Графически вот что я хочу:

Текущий:

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

Желаемая:

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

Если кто-то хотел получить фантазию, что мне не нужно делать, так как позже в моем скрипте я удаляю пустые файлы, но стоит упомянуть на тот случай, если я смогу узнать еще больше:

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

Я подхожу очень близко, но мне чего-то не хватает, и я уверен, что это просто / глупо. Вот что я бегу:

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

Вот что меня заводит:

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

На переполнении стека Джордж приблизил меня, дав мне:

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

так же как:

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

Команда mv - это, безусловно, путь, поскольку он чище и намного, намного быстрее. Но, увы, хотя он отлично работает с одной папкой, несколько папок превращают это в:

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

Итак, я все ближе, но не совсем там. Какие-либо предложения? Заранее спасибо!

1 ответ1

1

Вы можете использовать цикл for, чтобы упростить это. я использовал dirname $ tiem/.., чтобы поднять один уровень, и mindepth, чтобы ограничить эффект одним уровнем.

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

После переезда это становится

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$

Надеюсь, это поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .