1 заметка с тегом

командная строка

20 марта 2015, 11:59

Поговорим о рекурсии

Начинаешь, например, клепать вёрстку чего-нибудь:

~|⇒  mkdir test
~|⇒  cd test
~/test|⇒  touch index.html
~/test|⇒  touch style.css
~/test|⇒  mkdir css
~/test|⇒  mv style.css css
~/test|⇒  ls -al
total 0
drwxr-xr-x   5 rschweppes  staff   170 20 мар 11:11 .
drwxr-xr-x+ 86 rschweppes  staff  2924 20 мар 11:12 ..
drwxr-xr-x   3 rschweppes  staff   102 20 мар 11:11 css
-rw-r--r--   1 rschweppes  staff     0 20 мар 11:11 index.html

Клепает-клепает, а потом решает сделать вторую версию вёрстки из первой в подпапке v2, но не с нуля, а из копии этих файлов.

Для этого надо создать эту папку и скопировать в неё все файлы:

~/test|⇒  mkdir v2
~/test|⇒  cp -R * v2

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

Произошло следующее: папка v2 начала бесконечно копироваться в саму себя, создав длинное дерево

Так работает рекурсивный вызов команды cp, который, очевидно, нам не подходит.

Решение — rsync с параметром ‐‐exclude:

~/test|⇒  rsync -a --exclude=v2 * v2
~/test|⇒  tree
.
├── css
│   └── style.css
├── index.html
└── v2
    ├── css
    │   └── style.css
    └── index.html

3 directories, 4 files

И даже подпапку v2 заранее создавать не надо.

Кстати, если мы захотим не скопировать, а переместить содержимое папки в подпапку командой mv, получим более ожидаемый результат:

~/test|⇒  mv * v2
mv: rename v2 to v2/v2: Invalid argument

~/test|⇒  tree
.
└── v2
    ├── css
    │   └── style.css
    └── index.html

2 directories, 2 files

Так-то.