Как я расторгаю все подпапки

Существует ли острота командной строки для перемещения всего содержания всех прямых подпапок папки к самой папке и удалению подпапок (которые теперь пусты)? Т.е. устраните уровень в иерархии папок?

Чтобы быть абсолютно ясной, более глубокая подструктура папок должна быть сохранена.

Я столкнулся с этим пару раз теперь, и я был немного разочарован, это, кажется, не функция дельфина, ни чего-то другого, с чем люди борются.

Я подозреваю, что это, вероятно, придется разделить в два, переместив содержание подпапок, и удалив подпапки. Однако это может иметь нежелательный побочный эффект удаления пустых подпапок второго уровня.

4
задан 8 May 2017 в 12:34

3 ответа

На самом деле не реальная острота:

find . -mindepth 2 -maxdepth 2 -print -exec mv --backup=numbered -t . '{}' + \
&& find . -mindepth 1 -maxdepth 1 -type d -empty -delete

Первая находка все в подпапке с точной глубиной 2 и перемещение это к .. Затем найдите и удалите все пустые папки в текущем каталоге.

  • , если у Вас есть файлы/папки с тем же именем, они будут переименованы с original_filename.~n~ (n значение 1, 2, 3...).
  • Примечание, которое удалит все пустые подпапки.
<час>

Обновление:

я не доволен решением выше. Слишком много протестов и проблем. Например, когда - backup=numbered переименовывает родительскую папку Вашей папки, Вы хотите переместиться...

mkdir -p test/test
mv test/test . --backup=numbered
mv: cannot move 'test/test' to './test': No such file or directory

Лучшее использование временный каталог для предотвращения проблем. Временный dir должен быть в той же файловой системе для предотвращения потребности скопировать файлы.

tmpdir=$(mktemp -d)
find . -mindepth 2 -maxdepth 2 -print -exec mv -b -t $tmpdir '{}' +
find . -mindepth 1 -maxdepth 1 -type d -empty -delete
mv -b $tmpdir/* .
rm $tmpdir
5
ответ дан 1 December 2019 в 09:32
mv */* . && rmdir *

Перемещение все в подкаталогах в текущие каталоги. rmdir не удалит каталоги, если они не будут пусты, таким образом, вторая часть только удаляет пустые каталоги.

-1
ответ дан 1 December 2019 в 09:32

Для принятия мер против удаления пустых подкаталогов IMO, самый простой путь состоит в том, чтобы переместиться во временный каталог и затем переименовать временный каталог к старому. Скажите, что рассматриваемый каталог foo, и Вы хотите foo/*/* стать foo/*. Сделайте что-то как:

tar c --remove-files foo | tar xv --strip-components=2 --backup=t --one-top-level=temp
mv temp foo
  • С --remove-files, первое tar удалит файлы, поскольку это обрабатывает их, наконец удаляя foo самостоятельно.
  • С --strip-components=2, второе tar обрубит foo/*/ от путей это извлекает, таким образом, foo/a/b станет b.
  • --backup=t совпадает с с cp или mv - сделайте пронумерованные резервные копии. Однако mv делает копии каталогов, если у них есть то же имя, но tar объединит каталоги и сделает резервные копии файлов.
  • --one-top-level=temp говорит tar создать названный каталог temp и файлы извлечения там.

Например:

$ tree bar
bar
├── a
│  ├── c
│  │  └── bar
│  ├── d
│  │  └── bar
│  ├── e
│  │  └── bar
│  └── f
│  └── bar
├── b
│  ├── c
│  │  └── bar
│  ├── d
│  │  └── bar
│  ├── e
│  │  └── bar
│  └── f
│  └── bar
└── c
    ├── c
    │  └── bar
    ├── d
    │  └── bar
    ├── e
    │  └── bar
    └── f
        └── bar

И после выполнения tar команды:

$ tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=temp
bar/a/e/
bar/a/e/bar
bar/a/f/
bar/a/f/bar
bar/a/c/
bar/a/c/bar
bar/a/d/
bar/a/d/bar
bar/b/e/
bar/b/e/bar
Renaming ‘temp/e/bar’ to ‘temp/e/bar.~1~’
bar/b/f/
bar/b/f/bar
Renaming ‘temp/f/bar’ to ‘temp/f/bar.~1~’
bar/b/c/
bar/b/c/bar
Renaming ‘temp/c/bar’ to ‘temp/c/bar.~1~’
bar/b/d/
bar/b/d/bar
Renaming ‘temp/d/bar’ to ‘temp/d/bar.~1~’
bar/c/e/
bar/c/e/bar
Renaming ‘temp/e/bar’ to ‘temp/e/bar.~2~’
bar/c/f/
bar/c/f/bar
Renaming ‘temp/f/bar’ to ‘temp/f/bar.~2~’
bar/c/c/
bar/c/c/bar
Renaming ‘temp/c/bar’ to ‘temp/c/bar.~2~’
bar/c/d/
bar/c/d/bar
Renaming ‘temp/d/bar’ to ‘temp/d/bar.~2~’

$ tree temp
temp
├── c
│  ├── bar
│  ├── bar.~1~
│  └── bar.~2~
├── d
│  ├── bar
│  ├── bar.~1~
│  └── bar.~2~
├── e
│  ├── bar
│  ├── bar.~1~
│  └── bar.~2~
└── f
    ├── bar
    ├── bar.~1~
    └── bar.~2~

4 directories, 12 files

С tar вывод, Вы видите когда tar переименованные файлы для резервного копирования, позволяя Вам отслеживают, которым файлы стали который резервные копии.


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

tar c --remove-files bar | tar xv --strip-components=2 --backup=t --one-top-level=bar
1
ответ дан 1 December 2019 в 09:32

Другие вопросы по тегам:

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