Я часто хочу сделать несколько вариантов этой идиомы:
$ mkdir 2010
$ svn mv * 2010
Конечно, я получаю ошибку, потому что глобус также соответствует 2010:
svn: Cannot copy path '2010' into its own child '2010/2010'
Есть ли способ заменить "svn mv * 2010"
на другой однострочник, который делает правильную вещь?
mv
. Тем не менее, сmv
,mv * newdir
у меня работает, правда , с ошибкой.Ответы:
Под ksh, bash или zsh:
Под Bash, вам нужно запустить в
shopt -s extglob
первую очередь (положить его в свой~/.bashrc
). Под zsh вам нужноsetopt -o ksh_glob
сначала запустить (поместите в свой~/.zshrc
).Это не перемещает точечные файлы (файлы, чье имя начинается с
.
). Если у вас есть, переместите их отдельно. Будьте осторожны, чтобы исключить.svn
каталог, если он у вас есть. В кш или зш:В bash это сложнее, потому что вам также нужно явно исключить
.
и..
.У Zsh также есть другой, более короткий синтаксис, который требует запуска
setopt -o extended_glob
первым (опять же, вставьте это в~/.zshrc
):Первое расширение скобки вступает в игру, в результате чего
svn mv ^2010 2010
. Затем шаблон^2010
(ярлык «файлы совпадают,*
но не2010
») расширяется.Если у вас есть
.svn
каталог, вам нужно исключить его из переезда. Это нормально по умолчанию, поскольку.svn
не соответствует*
(это точечный файл). Однако есть осложнения:Если вы установили
glob_dots
опцию, вам также необходимо исключить.svn
:Если у вас есть точечные файлы, но вы не установили их
glob_dots
, вам нужно переместить их отдельно:Чтобы сделать это за один раз:
Другой способ, который будет работать в zsh в этом случае (если у вас нет подкаталогов), -
svn mv *(.D) 2010
это сопоставление только обычных файлов (.
), включая точечные файлы (D
).источник
ЗШ имеет полезный оператор Глобы , чтобы соответствовать все , кроме заданного имени
^
. Так что это будет работать (но это специфично для ZSH, и вам нужноsetopt extendedglob
сначала):источник
!()
синтаксисе, который работает сzsh
. Чем отличается^
синтаксис? Это не работает в моей оболочке, какой параметр мне нужно установить, чтобы включить его?setopt extendedglob
. Я не знал о!()
, это звучит как более перекрестный способ сделать этоsvn mv {^,}2010
чтобы не вводить имя каталога дваждыЕсли ваши файлы имеют «ручные» имена (без пробелов, непечатных символов или
\[?*
):источник