다음 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.pdf
그리고 폴더 file2.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
실수.
답변1
cp
이것은 명령의 버그가 아닙니다 . 을 입력하면 cp *.pdf
실제 cp
와일드카드 문자가 표시되지 않습니다.bash
와일드카드 는 가 아닌 으로 확장됩니다 .cp
. cp
하나의 매개변수만 입력했는지 어떻게 알 수 있나요 ?이는 bash 와일드카드의 부작용이므로 버그라고 할 수 없습니다.
답변2
당신은 무슨 일이 일어나고 있는지 꽤 잘 알고 있는 것 같습니다. 귀하의 예에서는 귀하가 *pdf
혼란 file1.pdf file2.pdf this_is_a_folder.pdf
스러워하는 것을 이해하지 못합니다. 가 해야 할 일을 하고 있을 때 복사 하고 Enter를 치 라고 cp
말하면 바로 그 일이 수행됩니다. 버그가 없으며 광고된 대로 작동합니다.file1.pdf
file2.pdf
this_is_a_folder.pdf
폴더 이름이 로 끝나므로 .pdf
에 포함되며, *.pdf
폴더이자 마지막 인수(알파벳순으로 정렬)이므로 cp
파일이 폴더에 복사됩니다. 예상한 동작을 얻으려면 와일드카드를 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
before로 끝나는 파일은 *.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
마지막 매개변수가 디렉터리가 아니기 때문에 오류를 반환합니다.
답변3
다른 답변에서 이미 지적했듯이 bash는 와일드카드를 확장한 다음 보이는 내용을 에 전달합니다 cp
. 이제 중지하겠습니다 cp
.file1.pdf file2.pdf this_is_a_folder.pdf
- 와일드카드 문자를 사용하지 마세요.
-t
스위치를 사용--target-directory
하고 대상을 지정하십시오.항상 와일드카드를 사용한 후에 대상을 마지막으로 선언하십시오.
cp *.pdf /I/want/to/copy/files/here
답변4
인수의 마지막 부분이 디렉터리인 경우 cp
지정된 파일이 해당 디렉터리로 복사됩니다. 디렉토리 이름을 지정했는지 여부는 중요하지 않습니다 foo.pdf
(왜 그 이름입니까?!). 와일드카드 확장은 파일 유형이 아닌 파일 이름(또는 디렉터리 이름)을 기반으로 합니다.
두 개의 매개변수를 사용하면 대상은 파일 또는 디렉터리가 될 수 있습니다. 파일의 경우 대상 파일이 삭제되고 원본 파일의 복사본으로 대체됩니다. 대상이 디렉터리인 경우 소스 파일의 복사본이 해당 디렉터리에 배치됩니다. 주어진 개요 중 하나를 참고하세요:
cp [OPTION]... [-T] SOURCE DEST
세 개 이상의 인수가 있는 경우 대상은 디렉터리로 처리됩니다.
cp [OPTION]... SOURCE... DIRECTORY