Bash

當源和目標相似時,在 bash 中使用萬用字元擴展的最佳方法是什麼?

  • March 12, 2020

假設我有這些文件夾:

$ ls
css-tricks/ django-tutorial/ good-tuts.txt js-tut/ tutorials/ tuts.txt

其中一些有tut他們的名字。我想將tut名稱中包含的所有文件/文件夾移動到文件夾中tutorials/。如果我執行命令

$ mv *tut* tutorials/

我收到以下消息:

mv: cannot move 'tutorials' to a subdirectory of itself, 'tutorials/tutorials'

我能做些什麼來避免這種情況?


我能想到的技巧之一是將目標文件夾臨時重命名為其他名稱,並在命令執行後將其更改回所需的名稱。但是,我希望知道一個更優雅的問題解決方案。

就個人而言,在我即將以互動方式發出命令的情況下,我只會這樣做mv *tut* tutorials並期望得到“無法移動”錯誤。它是無害的,其他文件和目錄將按預期移動。

命令的退出狀態將是非零,表示錯誤,但由於沒有任何依賴它,它可以被忽略。


在這種情況下,其他名稱之前包含一個破折號tut

mv *-tut* tutorials

或者,如果您也有類似的東西python_tut想要移動,也允許使用下劃線:

mv *[_-]tut* tutorials

tut或者,在子字元串(tutorials沒有)之前需要任何額外的字元,

mv *?tut* tutorials

通過更多的打字和思考,使用擴展的 globbing 模式bash

shopt -s extglob
mv *tut!(orials*) tutorials

第二個變體將匹配包含子字元串的任何內容,而tut不是緊跟字元串orials。模式不匹配tutorials,也會跳過tutorials1等。

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