Я думаю, вы установили не графическую версию emacs, а только простую версию терминала. Просто установите соответствующий пакет.
Я бы сделал это в bash
, используя globstar
. Как объясняется в man bash
:
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
Итак, чтобы переместить каталог run
в каталог верхнего уровня x
, а затем удалить остальные, вы можете сделать :
shopt -s globstar; mv x/**/run/ x/ && find x/ -type d -empty -delete
Команда shopt
включает параметр globstar
. mv x / ** / run / x /
переместит все подкаталоги с именем run
(обратите внимание, что это работает, только если есть только один каталог run
) в x
и find
удалит все пустые каталоги.
Если хотите, вы можете сделать все это в оболочке с расширенной глобализацией, но я предпочитаю подстраховку find -empty
, чтобы быть уверенным, что непустые каталоги не будут удалены. Если вас это не волнует, вы можете использовать:
shopt -s globstar; shopt -s extglob; mv x/**/run/ x/ && rm -rf x/!(run)
как насчет
find . -type d -name run -exec mv {} /path/to/X \;
где
(на стороне примечания есть опция - junk-paths
в zip-архиве, при архивировании или распаковке)
Определенно более подробный, но выполнение работы за один шаг:
#!/usr/bin/env python3
import shutil
import os
import sys
dr = sys.argv[1]
for root, dirs, files in os.walk(dr):
# find your folder "run"
for pth in [d for d in dirs if d == sys.argv[2]]:
# move the folder to the root directory
shutil.move(os.path.join(root, pth), os.path.join(dr, pth))
# remove the folder (top of the tree) from the directory
shutil.rmtree(os.path.join(dr, root.replace(dr, "").split("/")[1]))
get_folder.py
Запустите его с корневым каталогом (содержащим ваши разархивированные файлы) и именем папки, которую нужно «поднять» в качестве аргументов:
python3 / full / path /to/get_folder.py / full / path / to / folder_conpting_unzipped_dir run
И готово:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;
use File::Copy::Recursive qw(dirmove);
my @wanted;
find(sub{ -d $_ && $_ eq "run" && push @wanted,$File::Find::name}, $ARGV[0]);
dirmove("$wanted[0]","./run");
Это работает просто: найти ()
Подпрограмма будет рекурсивно обходить заданное дерево каталогов, находить каталог с именем run
и помещать его в массив требуемых имен файлов. В этом случае мы предполагаем, что в списке должен быть только один файл, поэтому после завершения команды мы используем dirmove ()
из модуля File :: Copy :: Recursive
и перемещаем это в текущий рабочий каталог, из которого был вызван скрипт. Таким образом, в вашем случае вы должны вызвать его из родительского каталога на x
.
Исходное дерево каталогов:
$ tree
.
└── levelone
└── leveltwo
└── levelthree
└── run
├── file1
├── file2
└── file3
Результат:
$ ~/find_dir.pl .
$ tree
.
├── levelone
│ └── leveltwo
│ └── levelthree
└── run
├── file1
├── file2
└── file3