Существует ли острота командной строки для перемещения всего содержания всех прямых подпапок папки к самой папке и удалению подпапок (которые теперь пусты)? Т.е. устраните уровень в иерархии папок?
Чтобы быть абсолютно ясной, более глубокая подструктура папок должна быть сохранена.
Я столкнулся с этим пару раз теперь, и я был немного разочарован, это, кажется, не функция дельфина, ни чего-то другого, с чем люди борются.
Я подозреваю, что это, вероятно, придется разделить в два, переместив содержание подпапок, и удалив подпапки. Однако это может иметь нежелательный побочный эффект удаления пустых подпапок второго уровня.
На самом деле не реальная острота:
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
mv */* . && rmdir *
Перемещение все в подкаталогах в текущие каталоги. rmdir не удалит каталоги, если они не будут пусты, таким образом, вторая часть только удаляет пустые каталоги.
Для принятия мер против удаления пустых подкаталогов 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