У меня есть такой вид дерева каталогов, который получается при распаковке zip-файла:
x -> y -> z -> run -> ФАЙЛЫ И КАТАЛОГИ ЗДЕСЬ
Таким образом, существует 4 каталога, 3 из которых не содержат файлов (x, y, z) и содержат только 1 подкаталог, и есть интересующий меня каталог с именем « run ».
Я хочу переместить сам каталог «run» (включая все внутри) в «корневую» папку, где я распакован (то есть, где находится «x», но не внутри «x»).
Допущения: существует папка с именем «run», но я не знаю, сколько каталогов мне понадобится для «cd», чтобы добраться до нее (может быть 3 (x, y, z), может быть 10 или более). также неизвестны и не должны быть x, y, z и т. д.).
Как я могу сделать это? Я перепробовал много вариантов этого вопроса, но все они провалились.
Ответы:
что о
где
(на боковой ноте есть
--junk-paths
опция в zip, либо при архивировании, либо при распаковке)источник
Я бы сделал это
bash
, используяglobstar
. Как объяснено вman bash
:Итак, чтобы переместить каталог в каталог
run
верхнего уровняx
, а затем удалить остальные, вы можете сделать:Команда
shopt
включаетglobstar
опцию. Командаmv x/**/run/ x/
переместит любые названные подкаталогиrun
(обратите внимание, что это работает только при наличии только одногоrun
каталога)x
иfind
удалит все пустые каталоги.Если хотите, вы можете сделать все это в оболочке с расширенным глобализацией, но я предпочитаю, чтобы сеть безопасности
find -empty
была уверена, что непустые каталоги не будут удалены. Если вас это не волнует, вы можете использовать:источник
Определенно более многословный, но выполняющий работу за один шаг:
Предполагая, что у вас установлен Python
Как пользоваться
get_folder.py
Запустите его с корневым каталогом (связываясь с вашими разархивированными файлами) и именем папки, которую нужно «поднять» в качестве аргументов:
И это сделано:
источник
Perl решение
Это работает просто:
find()
подпрограмма рекурсивно обходит заданное дерево каталогов, находит каталог с именемrun
и помещает его в массив желаемых имен файлов. В этом случае мы предполагаем, что в списке должен быть только один файл, поэтому после завершения команды мы используем модульdirmove()
изFile::Copy::Recursive
модуля и перемещаем его в текущий рабочий каталог, из которого был вызван скрипт. Таким образом, в вашем случае вы бы назвали его из родительского каталога вx
.Исходное дерево каталогов:
Результат:
источник