如何帶條件執行“mv”命令 - 將具有特定結尾的檔案移動到其他資料夾

如何帶條件執行“mv”命令 - 將具有特定結尾的檔案移動到其他資料夾

我是一名電腦科學專業的學生。上學第二年-我正在學習 Linux。由於冠狀病毒,我以獨立的方式學習。在我的學習過程中,我遇到了一個包含多個部分的問題 - 我無法解決它。

問題希望我執行mv命令 - 將一些文件傳輸到該文件夾。我嘗試執行該mv命令 - 並嘗試整合“pipe”或其他命令,例如find.

在我看來這不是一個正常的mv命令,需要整合更多的東西,我怎麼也無法破解它。我嘗試了幾天來解決這個問題。我也嘗試在論壇中找到類似的問題 - 但我找不到。

問題:

  1. 編寫一個命令來複製以該資料夾.c結尾的所有檔案。.hPrograms

我的嘗試可能是這樣做:

find "*.c" -o "*.h" | mv Programs

答案1

這份作業可以用三種方式解釋:

  1. 複製全部.c.h文件從目前目錄到目錄Programs,或
  2. 複製全部.c.h文件從目前目錄或其下面的任何位置到目錄Programs
  3. 複製所有可存取的.c.h 從系統上的任何地方到目錄Programs

請注意,作業說的是“複製”,而不是“移動”。這意味著您應該使用該cp命令,而不是mv.

作業的第一個解釋是透過以下方式解決的

cp *.[ch] Programs

(假設*.[ch]匹配我們感興趣的所有文件,並且當前目錄中沒有數千個文件)。

作業的第二種解釋是透過以下方式解決的

find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

這將搜尋當前目錄中或當前目錄下帶有.c或文件名稱後綴的所有常規文件,並對每個此類文件執行。我們無法透過管道連接,因為該實用程式不會讀取其標準輸入流。.hcpcp

我們也確保避免查看目錄內部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解決方案將複製隱藏檔案(名稱以點開頭的檔案),而第一個解決方案預設不會符合這些類型的名稱。

相關內容