“нечто mkdir; svn mv * нечто”

Мой фаворит - когда я создавал новую систему Соляриса для установки базы данных Oracle. Все существовало включая высокого оцененного консультанта оракула прямо в середине работы оптимизации DB, которую он делал. Я был в серверной, проверяющей другой сервер, когда я споткнулся за шнур питания к серверу.

9
06.02.2013, 21:10
3 ответа

Под ksh, ударом или zsh:

svn mv !(2010) 2010

Под ударом необходимо работать shopt -s extglob сначала (вставляет его Ваш ~/.bashrc). Под zsh необходимо работать setopt -o ksh_glob сначала (вставляет его Ваш ~/.zshrc).

Это не перемещает точечные файлы (файлы, имя которых начинается .). Если у Вас есть некоторые, переместите их отдельно. Заботьтесь для исключения .svn каталог, если у Вас есть тот. В ksh или zsh:

svn mv !(2010) .!(svn) 2010

В ударе это более сложно, потому что также необходимо явно исключить . и ...

svn mv !(2010) .!(svn|.|) 2010

Zsh также имеет другой, более короткий синтаксис, который требует выполнения setopt -o extended_glob сначала (снова, вставляет это ~/.zshrc):

svn mv {^,}2010

Первое расширение фигурной скобки играет роль, приводя к svn mv ^2010 2010. Затем шаблон ^2010 (ярлык для “соответствия файлов * но нет 2010”), расширен.

Если у Вас есть a .svn каталог, необходимо будет исключить его из перемещения. Это в порядке по умолчанию, как .svn не подобран * (это - точечный файл). Однако существуют сложности:

  • Если Вы установили glob_dots опция, необходимо будет исключить .svn также:

    svn mv !(2010|.svn) 2010             # requires setopt ksh_glob
    svn mv *~(.svn|2010) 2010            # requires setopt extended_glob
    
  • Если у Вас есть точечные файлы, и Вы не установили glob_dots, необходимо будет переместить их отдельно:

    svn mv {^,}2010
    svn mv .*~.svn 2010
    

    Сделать это сразу:

    svn mv *~(.svn|2010)(D) 2010
    

Иначе это работало бы в zsh в этом случае (если у Вас нет подкаталогов), svn mv *(.D) 2010, соответствовать только регулярным файлам (.) включая точечные файлы (D).

14
27.01.2020, 20:05

ZSH имеет полезный оператор шарика для соответствия всему кроме имени, ^. Таким образом, это работало бы (но это ZSH конкретный, и Вы должны setopt extendedglob сначала):

$ svn mv ^2010 2010
3
27.01.2020, 20:05
  • 1
    я знал о !() синтаксис, который работает с zsh. Как делает ^ синтаксис отличается? Это не работает в моей оболочке, какую опцию я должен был бы установить для включения его? –  Caleb 28.05.2011, 12:45
  • 2
    @Caleb Извините, я думал, что он шел по умолчанию, но по-видимому Вы должны setopt extendedglob. Я не знал о !(), это походит на большее количество перекрестной оболочки способ сделать это –  Michael Mrozek♦ 28.05.2011, 21:42
  • 3
    svn mv {^,}2010 чтобы не вводить имя каталога дважды А-ч –  Gilles 'SO- stop being evil' 06.02.2013, 21:07

Если Ваши файлы имеют “ручные” имена (никакой пробел, непечатные символы или \[?*):

svn mv $(ls | grep -vx 2010) 2010
0
27.01.2020, 20:05
  • 1
    нельзя доверять, чтобы иметь "ручные" имена. Когда-либо :) Решения для шарика оболочки, представленные для удара и zsh аккуратно, обходят эту проблему. –  Caleb 28.05.2011, 12:42

Теги

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