Переместить много папок и файлов в свои родительские папки

Мне нужно найти все папки с именем "test" и переместить все папки вместе с файлами внутри уровня на уровень их родительских папок:

html/folder1/js/test -> html/folder1/test

html/folder2/js/test -> html/folder2/test

более 500 папок

2 ответа

Решение

Вы можете сделать это с for цикл в каталоге, который является родителем folder1, folder2 и т. д. html каталог в вашем примере) так что сначала cd к нему (замените реальным путем:

cd /PATH/TO/html

В этой команде, если имя того, что вы хотите переместить, не test затем заменить test с настоящим именем или используйте *, чтобы переместить все:

for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done

Это переместит все вещи по имени test (и все их содержимое, если они являются каталогами) в подкаталогах текущего рабочего каталога в родительские каталоги, но это не приведет к удалению самих подкаталогов (поэтому js в твоем примере не удалится)

Пример:

до:

.
├── 15
│   └── rainbow
│       ├── test
│       └── fun

после:

.
├── 15
│   ├── rainbow
│   └── test
│       └── fun

Команда выдаст ошибку для всего, что не является каталогом с этой структурой и соответствующим содержимым, но все равно делает то, что вы хотите, поэтому, пожалуйста, проигнорируйте это или отправьте ошибки, добавив 2>/dev/null

for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done 2>/dev/null
find folder* -name 'test' -exec mv {} {}/../.. \;

объяснение

find folder* Поиски в любом ./folder* ( шаблоны шара, расширенные оболочкой)

-name 'test' для файлов с именем test,

-exec mv {} {}/../.. \; Перемещает их на два уровня выше 1. {} заменяется найденным именем. -exec Опция должна быть завершена с запятой. Вы можете сделать пробный прогон, добавив echo до mv,

1 Почему два уровня выше? Если бы мы переместили папку в родительскую папку, мы бы попросили сделать ее подпапкой ее текущей суперпапки, чтобы она оставалась в текущем месте. Однако мы хотим переместить его, чтобы он стал подпапкой родительского родительского элемента. Расширенная команда будет выглядеть mv folder1/js/test folder1/js/test/../.. который расширен до mv folder1/js/test folder1,

Заметка

Выполнение этой команды выдаст такие предупреждения:

find: ‘folder1/js/test’: No such file or directory

потому что он пытается найти в этой папке после того, как он был перемещен. Это можно заставить замолчать, указав 2> /dev/null,

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