Переместить много папок и файлов в свои родительские папки
Мне нужно найти все папки с именем "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,