Shell

cp 帶有一個包含萬用字元的參數

  • August 6, 2013

如果我有以下 2 個文件和 1 個文件夾:

someuser@computer:~/Desktop/test$ ls -l
total 340
-rw-r--r-- 1 someuser someuser  45082 ago  5 09:56 file1.pdf
-rw-r--r-- 1 someuser someuser 291836 ago  5 09:56 file2.pdf
drwxrwxr-x 2 someuser someuser   4096 ago  5 09:56 this_is_a_folder.pdf

然後我執行以下命令(注意我省略了目的地):

cp *.pdf

file1.pdffile2.pdf複製到this_is_a_folder.pdf文件夾中。

someuser@computer00:~/Desktop/test$ ls this_is_a_folder.pdf/
file1.pdf  file2.pdf

顯然*.pdf是擴展到匹配項,所以它相當於

cp file1.pdf file2.pdf this_is_a_folder.pdf

…和this_is_a_folder.pdf文件夾一樣,然後將兩個文件複製到其中。

這是一個錯誤嗎?

這顯然是萬用字元擴展的副作用,這不是我所期望的。

我會預料到一個missing destination file 錯誤

這不是cp命令中的錯誤。當您輸入時cp *.pdfcp永遠不會看到實際的萬用字元,因為萬用字元是由擴展的bash,而不是擴展的cp。如何cp知道您只輸入了一個參數?這是 bash 萬用字元的副作用,不能稱為錯誤。

你似乎非常了解正在發生的事情。在您的範例中,*pdf確實擴展到file1.pdf file2.pdf this_is_a_folder.pdf. 我看不出你有什麼困惑。cp正在做它應該做的事情,你告訴它複製file1.pdffile2.pdf進入this_is_a_folder.pdf,這正是它正在做的事情。沒有錯誤,它正在像宣傳的那樣工作。

由於您的文件夾名稱以 結尾.pdf,因此它包含在其中,*.pdf並且由於它是一個文件夾,並且最後一個參數(按字母順序排序),cp因此將文件複製到其中。要獲得您期望的行為,您需要保護萬用字元免受 shell 的影響,以便在cp看到它之前不會對其進行擴展:

$ cp "*pdf"
cp: missing destination file operand after `*pdf'
Try `cp --help' for more information.

請注意,在這種情況下,萬用字元沒有展開,因此cp實際上是在尋找一個名為*.pdf. 因此,即使您使用目錄作為最後一個參數 ( cp "*.pdf" foo/) 來呼叫它,它也會抱怨cannot stat '*.pdf': No such file or directory. cp *pdf如果您嘗試在僅包含一個文件的目錄中嘗試,您還將看到預期的行為,.pdf因為*.pdf將擴展為僅一個參數:

$ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Aug  5 16:56 file1.pdf
$ cp *pdf
cp: missing destination file operand after `file1.pdf'
Try `cp --help' for more information.

還與此進行比較:

$ ls -l
total 0
drwxr-xr-x 1 terdon terdon 0 Aug  5 16:56 a_folder.pdf
-rw-r--r-- 1 terdon terdon 0 Aug  5 16:56 file1.pdf
-rw-r--r-- 1 terdon terdon 0 Aug  5 16:56 file2.pdf
$ cp *pdf
cp: target `file2.pdf' is not a directory

在這裡,由於文件夾的名稱以 , 開頭a*.pdf因此擴展為: a_folder.pdf file1.pdf file2.pdf。因此,cp實際執行的命令是

cp a_folder.pdf  file1.pdf  file2.pdf

由於最後一個參數不是目錄,因此返回錯誤。

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