한 디렉터리에서 다른 디렉터리로 일반 파일만 복사

한 디렉터리에서 다른 디렉터리로 일반 파일만 복사

1번 디렉토리의 내용을 2번 디렉토리로 복사하고 싶습니다. 그러나 디렉터리가 아닌 디렉터리 1에서만 파일을 복사하고 싶습니다. 어떻게 해야 합니까?

cp dir1/* dir2/*

음, 여전히 디렉토리 문제가 있습니다.

또한 내 파일에는 확장자가 없으므로 *.*작동하지 않습니다.

답변1

cp dir1/* dir2

cp명시적으로 지시하지 않는 한 디렉토리는 복사되지 않습니다( 예를 들어 --recursive참조 man cp).

참고 1: cp0이 아닌 상태로 종료될 가능성이 높지만 파일은 어쨌든 복사됩니다. 이는 종료 코드( &&, 등) 를 기반으로 명령을 연결할 때 문제가 될 수 있습니다. (감사합니다 ||.if cp -r dir1/* dir2; then ...콘테비스~을 위한이 문제에 대해 그들이 말한 것)

노트 2: cp마지막 인수는 단일 파일 이름 또는 디렉터리일 것으로 예상됩니다. *대상 디렉터리 이름 뒤에는 와일드카드 문자가 없어야 합니다. .예기치 않은 일 dir2\*처럼 셸에 의해 확장됩니다.dir1\*~ 할 것이다발생하다:

  • 비어 있고 dir2쉘 및 설정에 따라 다릅니다.
    • 최상의 시나리오인 오류 메시지만 나타날 수 있습니다.
    • dir2/*문자 그대로 사용되며( 이름이 지정된 파일/디렉토리 찾기 ) 실제로 존재 *하지 않는 한 오류가 발생할 수도 있습니다 .*
    • dir2/*cp dir1/*확장자에 따라 명령에서 완전히 제거되어 dir1/*데이터가 손상될 수도 있습니다.
      • dir1/*파일이나 디렉터리가 하나만 일치 하면 오류가 발생합니다 cp.
      • 정확히 두 개의 파일이 일치 하면 dir1/*한 파일이 다른 파일로 덮어쓰여집니다(나쁜).
      • dir/*여러 파일이 일치하고 마지막 일치 항목이 a인 경우 오류 메시지가 표시됩니다.
      • 마지막 일치 항목 dir/*이 디렉터리인 경우 다른 모든 일치 항목은 해당 디렉터리로 이동됩니다.
  • 비어 있지 않으면 dir2다시 다음에 따라 달라집니다.
    • 마지막 일치 항목 dir2/*이 디렉터리인 경우 dir1/*다른 일치 항목이 dir2/*안으로 이동됩니다.
    • 마지막 일치 항목 dir2/*이 파일인 경우 오류 메시지가 나타날 수 있습니다.~하지 않는 한 dir1/*하나의 파일만 일치합니다.

답변2

명령이 아닌 와일드카드를 확장하는 것은 쉘입니다. 따라서 cp dir1/* dir2/*먼저 두 개의 와일드카드를 확장한 다음 cp결과를 호출하세요. 이는 예상한 것과 전혀 다릅니다. dir2에 이미 있는 파일 수에 따라 dir2/*하나 이상의 매개변수로 확장될 수 있습니다. 이 명령은 cp첫 번째 모드를 확장하여 가져온 매개변수와 두 번째 모드를 확장하여 가져온 매개변수를 알지 못합니다. 마지막 매개변수는 대상 디렉터리의 이름이 될 것으로 예상됩니다. 따라서 디렉터리의 모든 파일을 dir1디렉터리로 복사하려면 dir2마지막 매개변수가 디렉터리여야 합니다 dir2.

cp dir1/* dir2

*모든 파일이 일치 하므로 cp모든 파일을 복사하려고 시도합니다. 여기에는 디렉터리가 포함됩니다. 디렉터리도 파일입니다. 디렉터리를 건너뛰지만 오류를 보고합니다. 명명된 파이프(무언가를 기록해 두는 것이 더 낫습니다. 그렇지 않으면 cp차단됩니다) 등과 같은 특수 파일의 내용을 복사합니다.

복사만 가능정기적인파일의 경우 일치 항목을 제한해야 합니다. zsh에서는 사용할 수 있습니다글로벌 예선 .그 이유는 다음과 같습니다.

cp dir1/*(.) dir2

다른 껍질에는 이것이 없습니다. 이 find명령을 사용하여 파일 형식을 필터링할 수 있습니다. 내장되지 않은 Linux 또는 Cygwin을 실행한다고 가정합니다.

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

Linux, FreeBSD 및 OSX의 경우:

find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2

답변3

"cp" 대신 "rsync"를 사용할 수 있습니다.

rsync -vt dir1/* dir2/

더 깨끗하고 어떤 경우에는 더 빠릅니다.

답변4

다음은 원본 디렉터리에서 대상 디렉터리로 파일을 복사하는 명령입니다.

  1. 소스 폴더로 이동하여 다음 명령을 작성하십시오.

    $ cp fileName destination directory path

예:

cp publichOT.sh  /data/home/useradmin

관련 정보