Linux: переместить файлы из неизвестной папки в неизвестный родительский файл той же неизвестной папки

315
Peter

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

Проблема: у меня много папок, в которых есть папка, с файлами внутри. Я хочу переместить файлы 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" "$"' sh {} \; 

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

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

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

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 

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

0
[Допускается ли перекрестная публикация вопроса на нескольких сайтах Stack Exchange, если вопрос по теме для каждого сайта?] (Https://meta.stackexchange.com/a/64069/132956) Steven 6 лет назад 0
Бьет меня, но сайт, на котором я первоначально разместил его, кто-то прыгнул на меня и сказал, чтобы поставить его здесь. Итак, вздох ..... Все, что я хочу, - это какая-то кровавая помощь. Peter 6 лет назад 0
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он был [перекрестно опубликован в SO] (https://stackoverflow.com/q/49968420), в то время как [его не должно быть] (https: // meta .stackexchange.com / а / 64069/132956). На данный момент вопрос проголосовал там (с уже проголосовавшим ответом), здесь проголосовали. Kamil Maciorowski 6 лет назад 2
Да, хотя он, вероятно, * принадлежит * здесь, на SU больше, чем на SO, у него там хороший ответ, и аргументы о том, куда все идет, становятся академическими. Не унывай, пожалуйста, Питер, из-за этой очевидной ссоры: цель разных сайтов с разными темами - разжигать сообщества, которые являются темными и влиятельными по этим темам. Так что, пожалуйста, не создавайте кросс-посты в будущем, но SU, вероятно, является лучшим местом для начала вопроса, если вы не уверены, куда он должен идти, потому что мы являемся одним из наиболее общих сайтов SE. music2myear 6 лет назад 1
Спасибо, @ music2myear, за твой комментарий. Я ценю это, как я признаю, я был действительно разочарован всей ситуацией. К счастью, Джордж дал мне отличный ответ, а G-Man - еще один способ сделать это, который также дал мне хороший совет по будущему устранению неполадок. Между вами тремя моя вера была восстановлена. Береги себя! Peter 6 лет назад 1

1 ответ на вопрос

1
Peter Moore

Вы можете использовать цикл 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$ 

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

Похожие вопросы