如何使用條件執行“mv”命令 - 將具有特定結尾的文件移動到其他文件夾
我是一名電腦科學專業的學生。學校的第二年 - 我正在學習 Linux。因為冠狀病毒,我以獨立的方式學習。在我學習期間,我遇到了一個包含多個部分的問題 - 我無法解決它。
問題要我執行
mv
命令 - 我將一些文件傳輸到文件夾。我嘗試執行mv
命令 - 並嘗試集成“管道”或其他命令,如find
.這在我看來不是一個正常的
mv
命令,需要集成更多的東西,我怎麼破譯不了。我試圖解決這個問題幾天。我也試圖在論壇中找到類似的問題 - 但我找不到它們。問題:
- 編寫一個命令,將所有以文件夾結尾的文件複製
.c
或複製.h
到該Programs
文件夾中。我的嘗試可能是這樣做:
find "*.c" -o "*.h" | mv Programs
賦值可以用三種方式解釋:
- 將所有
.c
和.h
文件從目前目錄複製到該目錄Programs
,或- 將所有
.c
和.h
文件從目前目錄或它下面的任何地方復製到目錄Programs
。- 將所有可訪問
.c
和.h
從系統上的任何位置複製到目錄Programs
。請注意,作業說的是“複製”,而不是“移動”。這意味著您應該使用
cp
命令,而不是mv
.賦值的第一個解釋是由
cp *.[ch] Programs
(假設
*.[ch]
匹配我們感興趣的所有文件,並且目前目錄中沒有數千個)。賦值的第二種解釋由
find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
這將在目前目錄中或目前目錄下搜尋所有帶有
.c
或.h
文件名後綴的正常文件,並cp
為每個此類文件執行。我們無法通過管道傳輸,cp
因為該實用程序不讀取其標準輸入流。我們還確保避免查看
Programs
目錄內部(假設是目前目錄中的子目錄)。不這樣做最終會將文件從復製Programs
到Programs
. 有關和的更多資訊,請參閱“解釋 find 的 -path 和 -prune 選項” 。-path``-prune
第三種解釋從第二種很容易實現:
find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
…我們只需要從
find
目錄樹的頂部開始,並指定Programs
要避免的目錄是路徑中的目錄$PWD/Programs
。由於您無法在任何地方訪問,這可能會給您帶來許多錯誤。為避免這種情況,還要修剪您無法訪問的目錄並僅複製您可以讀取的文件:
find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \ -type f -name '*.[ch]' -readable -exec cp {} Programs \;
這需要 GNU
find
進行-executable
測試(如果目錄是可執行的,則可以搜尋該目錄)和-readable
測試。請注意,
find
此處的變體將文件限制為僅正常文件(通過-type f
測試),而該cp *.[ch]
方法將複製以這兩個字元結尾的任何類型的內容。此外,該find
解決方案將複製隱藏文件(名稱以點開頭的文件),而第一個解決方案預設情況下不會匹配這些類型的名稱。