Bash
當源和目標相似時,在 bash 中使用萬用字元擴展的最佳方法是什麼?
假設我有這些文件夾:
$ 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
等。