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

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

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

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

для более чем 500 папок

3
задан 17 December 2016 в 13:17

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
0
ответ дан 17 December 2016 в 13:17
find folder* -name 'test' -exec mv {} {}/../.. \;

Объяснение

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

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

-exec mv {} {}/../.. \; Перемещает их два уровня higher1. {} заменяется найденным именем. -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.

2
ответ дан 17 December 2016 в 13:17

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

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