Zsh

如何將文件夾中的所有文件移動到 zsh w/Mac OS X 中的子文件夾?

  • February 17, 2020

這個問題基本上是這個的副本:https ://askubuntu.com/questions/91740/how-to-move-all-files-in-current-folder-to-subfolder

但相反,我問的是如何使用 oh-my-zsh 在 Mac OS X 終端中執行此操作。

我對給出的解決方案的問題是它們似乎在我的終端中不起作用(在這裡用“oldCodeBase”替換問題中的文件夾“new”)

[~/Sid/Moonshine_Machine, 127, master+3]: mv !(oldCodeBase) oldCodeBase
zsh: number expected

它在這裡期望的數字是多少?

轉向另一個建議的解決方案是使用 shopt 命令。

但我似乎沒有可用的 shopt 命令:

~/Sid/Moonshine_Machine, 1, master+3]: shopt -s extglob dotglob
zsh: command not found: shopt

所以在這一點上,這兩種解決方案似乎都不起作用。

編輯:

我發現 zsh 中的“setopt”似乎是與“shopt”相當的命令,但會導致以下問題

[~/Sid/Moonshine_Machine, 127, master+3]: setopt -s extglob dotglob
setopt: no such option: extglob

!(pattern)是一個 ksh glob 運算符。shopt是 bash shell 的內置命令,用於啟用其選項之一(未使用 啟用的選項set -o)。bashextglob選項啟用 ksh 擴展 glob 運算符的子集。

zsh中,否定與^ extendedglob操作員一起使用,正如@mdmay74 已經顯示的那樣,並且 zsh 只有一組選項全部用set -o/切換set +o(歷史上setopt/ unsetopt)。所以你會使用:

set -o extendedglob
mv -- ^oldCodeBase(D) oldCodeBase

筆記:

  • --如果有以開頭的文件名,則需要-
  • (D)還需要移動隱藏文件(在 中bash,您將使用shopt -s dotglob)。

zsh 還有一個kshglob選項來啟用 ksh 的擴展 glob。但由於這些操作比 zsh 自己的擴展 glob 操作符使用起來更麻煩,因此您通常只將其用作 ksh 仿真 ( emulate ksh) 的一部分,用於幫助解釋為 ksh 編寫的腳本。

set -o kshglob
mv -- !(oldCodeBase)(D) oldCodeBase

(請注意,除非您還禁用了該選項,否則!(oldCodeBase)僅此一項將不起作用,否則將被視為 glob 限定符)。bareglobqual``(oldCodeBase)

更一般地說,您不能假設在一種語言中有效的某件事在另一種語言中也同樣有效,除非該事物來自它們共享的標准或共同遺產。bash並且zsh兩者都有 Bourne、Korn 和 Csh 的傳統,每個都有一種模式,在這種模式下,它們都試圖與 POSIX 兼容,並且還相互複製了一些特性,但它們的語法通常不同。

引用自:https://unix.stackexchange.com/questions/567970