Мне нужно найти все папки с именем «test» и переместить все папки вместе с файлами внутри уровня на уровень их родительских папок:
html/folder1/js/test -> html/folder1/test
html/folder2/js/test -> html/folder2/test
для более чем 500 папок
Можно сделать это с 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 {} {}/../.. \;
Перемещает их два уровня 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
.