為什麼這有效
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
部分可能會也可能不會擴展,具體取決於目錄中是否存在與output
glob 相符的任何內容。如果確實如此,情況會變得更糟,例如:
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 個語句,這才是您真正想要的。