와일드카드를 포함하는 단일 인수가 있는 cp

와일드카드를 포함하는 단일 인수가 있는 cp

다음 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.pdffile2.pdfthis_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 directorycp *pdf하나.pdfbefore로 끝나는 파일은 *.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

관련 정보