Как извлечь папку с конкретным именем из рекурсивного каталога, удалить остальные?

Я думаю, вы установили не графическую версию emacs, а только простую версию терминала. Просто установите соответствующий пакет.

10
09.02.2019, 20:57
4 ответа

Я бы сделал это в 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)
7
27.01.2020, 19:59

как насчет

  find . -type d -name run -exec mv {} /path/to/X \;

где

  • / путь / к / X - это ваш целевой каталог
  • , с которого вы начинаете с этого же места.
  • затем используйте другой ответ, чтобы удалить пустые каталоги.

(на стороне примечания есть опция - junk-paths в zip-архиве, при архивировании или распаковке)

14
27.01.2020, 19:59

Определенно более подробный, но выполнение работы за один шаг:

Предполагается, что у вас установлен python

#!/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]))

Как использовать

  1. Скопируйте скрипт в пустой файл, сохраните его как get_folder.py
  2. Запустите его с корневым каталогом (содержащим ваши разархивированные файлы) и именем папки, которую нужно «поднять» в качестве аргументов:

     python3 / full / path /to/get_folder.py / full / path / to / folder_conpting_unzipped_dir run 
     

И готово:

enter image description here

enter image description here

6
27.01.2020, 19:59

Решение Perl

#!/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
4
27.01.2020, 19:59

Теги

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