我是一名電腦科學專業的學生。上學第二年-我正在學習 Linux。由於冠狀病毒,我以獨立的方式學習。在我的學習過程中,我遇到了一個包含多個部分的問題 - 我無法解決它。
問題希望我執行mv
命令 - 將一些文件傳輸到該文件夾。我嘗試執行該mv
命令 - 並嘗試整合“pipe”或其他命令,例如find
.
在我看來這不是一個正常的mv
命令,需要整合更多的東西,我怎麼也無法破解它。我嘗試了幾天來解決這個問題。我也嘗試在論壇中找到類似的問題 - 但我找不到。
問題:
- 編寫一個命令來複製以該資料夾
.c
結尾的所有檔案。.h
Programs
我的嘗試可能是這樣做:
find "*.c" -o "*.h" | mv Programs
答案1
這份作業可以用三種方式解釋:
- 複製全部
.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 \;
這需要 GNUfind
進行-executable
測試(如果目錄是可執行的,則該目錄是可搜尋的)和-readable
測試。
請注意,find
此處的變體將文件限制為僅常規文件(通過測試-type f
),而該cp *.[ch]
方法將複製以這兩個字元結尾的任何類型的內容。此外,該find
解決方案將複製隱藏檔案(名稱以點開頭的檔案),而第一個解決方案預設不會符合這些類型的名稱。