為什麼這在 shell 的 for 循環中有效,但它本身卻不起作用

為什麼這在 shell 的 for 循環中有效,但它本身卻不起作用

為什麼這有效

for X in A* ; do cp $X/output.txt output/$X.txt ; done

但不是這個

cp A*/output.txt output/A*.txt

用於將 output.txt 檔案從名為 A1、A2、A3、A4 等的多個資料夾複製到名為「output」的組合資料夾中,為每個文字檔案提供其來源資料夾的名稱。

答案1

因為外殼將A*.txt部分擴展為多種的傳遞給正在呼叫的命令之前的路徑(cp在本例中)。

這意味著在第一種情況下,如果您有名為A1.txt、A2.txt、A3.txt 和A4.txt 的檔案以及目錄A1、A2、A3 和A4,每個目錄都包含output.txt,它將擴展為就像是:

for X in A1.txt A2.txt A3.txt A4.txt ; do cp $X/output.txt output/$X.txt ; done

在第二種情況下,它擴展到:

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A*.txt

其中該output/A*.txt部分可能會也可能不會擴展,具體取決於目錄中是否存在與outputglob 相符的任何內容。如果確實如此,情況會變得更糟,例如:

cp A1/output.txt A2/output.txt A3/output.txt A4/output.txt output/A8.txt output/A9.txt

因為cp當給定多個來源檔案時需要一個目的地目錄最後,它不知道如何處理這個問題,只是舉手並給你一個錯誤。

答案2

原因是,如果 的參數超過兩個cp,則最後一個參數必須是一個目錄。這cp 手冊頁狀態:

概要

cp [選項]... [-T] 來源目標

cp [選項]...來源...目錄

cp [選項]... -t 目錄來源...

描述

將 SOURCE 複製到 DEST,或將多個 SOURCE 複製到 DIRECTORY。

你寫的命令,

  cp file1 file2 file3 file4

本來的意思是

 cp file1 file3; cp file2 file4

但由於上述原因,事實並非如此。相反,for 迴圈恰好會產生上面的 2 個語句,這才是您真正想要的。

相關內容