Linux

如何使用條件執行“mv”命令 - 將具有特定結尾的文件移動到其他文件夾

  • April 7, 2020

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

問題要我執行mv命令 - 我將一些文件傳輸到文件夾。我嘗試執行mv命令 - 並嘗試集成“管道”或其他命令,如find.

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

問題:

  1. 編寫一個命令,將所有以文件夾結尾的文件複製.c或複製.h到該Programs文件夾中。

我的嘗試可能是這樣做:

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

賦值可以用三種方式解釋:

  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.h文件名後綴的正常文件,並cp為每個此類文件執行。我們無法通過管道傳輸,cp因為該實用程序不讀取其標準輸入流。

我們還確保避免查看Programs目錄內部(假設是目前目錄中的子目錄)。不這樣做最終會將文件從復製ProgramsPrograms. 有關和的更多資訊,請參閱“解釋 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解決方案將複製隱藏文件(名稱以點開頭的文件),而第一個解決方案預設情況下不會匹配這些類型的名稱。

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