Saya sering ingin melakukan beberapa varian dari ungkapan ini:
$ mkdir 2010
$ svn mv * 2010
Tentu saja, saya mendapatkan kesalahan karena glob juga cocok dengan 2010:
svn: Cannot copy path '2010' into its own child '2010/2010'
Apakah ada cara untuk mengganti "svn mv * 2010"
dengan liner yang berbeda yang melakukan hal yang benar?
mv
juga. Namun, denganmv
,mv * newdir
bekerja untuk saya, meskipun dengan kesalahan.Jawaban:
Di bawah ksh, bash, atau zsh:
Di bawah bash, Anda harus menjalankannya
shopt -s extglob
dulu (letakkan di Anda~/.bashrc
). Di bawah zsh, Anda harus menjalankannyasetopt -o ksh_glob
dulu (letakkan di Anda~/.zshrc
).Ini tidak memindahkan file dot (file yang namanya dimulai dengan
.
). Jika Anda memiliki beberapa, pindahkan secara terpisah. Berhati-hatilah untuk mengecualikan.svn
direktori jika Anda memilikinya. Dalam ksh atau zsh:Dalam bash, ini lebih rumit karena Anda juga perlu mengecualikan
.
dan..
.Zsh juga memiliki sintaks yang berbeda dan lebih pendek, yang mengharuskan berjalan
setopt -o extended_glob
terlebih dahulu (sekali lagi, masukkan ini~/.zshrc
):Ekspansi brace pertama ikut berperan, menghasilkan
svn mv ^2010 2010
. Kemudian pola^2010
(jalan pintas untuk "file yang cocok*
tetapi tidak2010
") diperluas.Jika Anda memiliki
.svn
direktori, Anda harus mengeluarkannya dari pemindahan. Ini ok secara default, karena.svn
tidak cocok dengan*
(ini file dot). Namun, ada beberapa komplikasi:Jika Anda telah mengatur
glob_dots
opsi, Anda harus mengecualikan.svn
juga:Jika Anda memiliki file dot dan belum Anda atur
glob_dots
, Anda harus memindahkannya secara terpisah:Untuk melakukannya dalam sekali jalan:
Cara lain yang akan bekerja di zsh dalam kasus ini (jika Anda tidak memiliki subdirektori) adalah
svn mv *(.D) 2010
, untuk mencocokkan hanya file biasa (.
) termasuk file dot (D
).sumber
ZSH memiliki operator glob yang membantu mencocokkan semuanya kecuali nama yang diberikan
^
,. Jadi ini akan berhasil (tapi khusus ZSH, dan Anda harussetopt extendedglob
terlebih dahulu):sumber
!()
sintaks yang berfungsizsh
. Apa^
perbedaan antara sintaksis? Ini tidak berfungsi di shell saya, opsi apa yang harus saya atur untuk mengaktifkannya?setopt extendedglob
. Saya tidak tahu!()
, sepertinya cara yang lebih mudah untuk melakukannyasvn mv {^,}2010
untuk menghindari mengetik nama direktori dua kaliJika file Anda memiliki nama "jinak" (tanpa spasi, karakter yang tidak diinginkan atau
\[?*
):sumber