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


12

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

cp dir1/* dir2/*

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

또한 모든 파일에는 확장자가 없으므로 . 트릭을하지 않습니다


1
어떤 확장 기능과 관련이 있는지 모릅니다.
ctrl-alt-delor

1
cp dir1/* dir2또는cp -t dir2 dir1/*
ctrl-alt-delor 12

@richard 디렉토리를위한 확장을 사용하지 않는 DOS 세계에서 오는 일반적인 습관이 있습니다. 이것은 여전히 ​​어느 정도 살아 남기 때문에 일부 사람들은 점이 있으면 디렉토리가 아니라고 가정합니다.
질 'SO-정지 존재 악마'

그래도 여전히 관련이 없습니다.
ctrl-alt-delor

답변:


18
cp dir1/* dir2

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

참고 1 : cp 대부분 0이 아닌 상태로 종료되지만 파일은 어쨌든 복사되었습니다. 종료 코드에 따라 명령을 체인 때이 문제가 될 수 있습니다 : &&, ||, if cp -r dir1/* dir2; then ..., 등 (덕분에 contrebis 에 대한 그 문제에 대한 자신의 의견 )

참고 2 : cp마지막 매개 변수는 단일 파일 이름 또는 디렉토리 일 것으로 예상합니다. *대상 디렉토리 이름 뒤에는 와일드 카드가 없어야합니다 . dir2\*처럼 쉘에 의해 확장됩니다 dir1\*. 예기치 않은 일 발생합니다.

  • 경우는 dir2비어 쉘 및 설정에 따라 수 있습니다 :
    • 가장 좋은 시나리오 인 오류 메시지가 표시 될 수 있습니다.
    • dir2/*문자 그대로 (라는 파일 / 디렉토리를 찾습니다 *) *실제로 존재 하지 않는 한 오류가 발생할 수 있습니다.
    • dir2/*명령에서 완전히 제거되고 cp dir1/*. 의 확장에 따라 dir1/*데이터를 파괴 할 수도 있습니다.
      • 경우 dir1/*일치 하나 개의 파일이나 디렉토리, 오류를으로부터 얻을 것이다 cp.
      • dir1/*정확히 두 개의 파일과 일치 하면 하나는 다른 하나 ( Bad ) 로 덮어 씁니다 .
      • dir/*여러 파일 이 일치하고 마지막 일치가 a 인 경우 오류 메시지가 표시됩니다.
      • 마지막 일치 항목이 dir/*디렉토리 인 경우 다른 모든 일치 항목 이 해당 디렉토리로 이동합니다.
  • 경우 dir2비어 있지 않은, 다시 따라 달라집니다
    • 마지막 일치 항목이 dir2/*디렉토리이면 dir1/*다른 일치 항목 dir2/*이 이동됩니다.
    • 마지막 일치 항목이 dir2/*파일 인 경우 dir1/* 파일이 하나만 일치 하지 않으면 오류 메시지가 표시 될 수 있습니다.

$ cp dir1/* dir2-> cp: dir1/isadir is a directory (not copied).상태 1로 종료됩니다.
contrebis

1
예, 상태 1로 종료됩니다. 그러나 그럼에도 불구하고 내가 확인한 모든 시스템 (아치 리눅스, 우분투 14.04, OpenBSD 3.9 및 5.5, SuSE Linux 8.1, FreeBSD 6.2, Solaris 8, 9 및 10) ( 실제 코드 2로 종료) 에서 cp일치하는 파일을 복사합니다 . 따라서이 동작은 새로운 것이 아니며 (SuSE 8.1은 2002 년부터) Linux로 제한되지도 않습니다. 지시받은 모든 것을 할 수 없기 때문에 0이 아닌 종료 코드로 종료합니다 . 그렇다고 아무것도 하지 않는다는 의미는 아닙니다 . dir1/*cpcp
Adaephon

3
물론, 명령을 체인으로 연결 &&하면 문제가 발생할 수 있으므로 주목할 가치가 있다고 생각했습니다 . 나는 지금 상황을 기억할 수 없지만 이런 식으로 노력하고있었습니다.
contrebis

숨겨진 파일은 복사하지 않습니다.
felwithe

@felwithe *숨겨진 파일 포함 여부 또는 숨겨진 파일 포함 방법은 셸에 따라 다릅니다. 에 *숨겨진 파일이 포함 되어 있지 않으면와 일치시킬 수 있습니다 .*. 이 포함되므로주의 ...bashdash있지만에 zsh. 이 답변의 맥락에서 당신은 멀리 얻을 수 cp dir1/* dir1/.* dir2있기 때문 ...디렉토리하며 복사되지 않습니다. zsh로 숨겨진 파일을 포함하도록 만들 수도 있습니다 *(D).
Adaephon

7

명령이 아닌 와일드 카드를 확장하는 쉘입니다. 따라서 cp dir1/* dir2/*먼저 두 개의 와일드 카드를 확장 한 다음 cp결과 를 호출 합니다. 이것은 당신이 분명히 예상과 전혀되지 않습니다 : 이미 얼마나 많은 파일에 따라 dir2, dir2/*하나 개 이상의 인수로 확장 할 수있다. 이 명령 cp은 첫 번째 패턴을 확장 한 데 따른 인수와 두 번째 패턴을 확장 한 데 따른 인수를 모릅니다. 마지막 인수는 대상 디렉토리의 이름이 될 것으로 예상합니다. 따라서 모든 파일을 디렉토리에서 디렉토리 dir1로 복사 dir2하려면 마지막 인수는 디렉토리 여야합니다 dir2.

cp dir1/* dir2

*모든 파일과 일치 하므로 모든 파일 cp을 복사하려고 시도합니다. 여기에는 디렉토리가 포함됩니다. 디렉토리도 파일입니다. 디렉토리를 건너 뛰지 만 오류를보고합니다. 명명 된 파이프와 같은 특수 파일의 내용 (복사하는 것이 좋거나 cp차단 될 것) 등 의 내용을 복사합니다 .

일반 파일 만 복사하려면 일치를 제한해야합니다. zsh에서는 다음에 대해 glob 규정 . 자를 사용할 수 있습니다 .

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

지정하는 이유가 있나요 -maxdepth 1. 또한 대상 디렉토리에서 원래 디렉토리 계층을 재귀 적으로 복사하고 보존하는 방법이 있습니까?
Abdull

없이 @Abdull -maxdepth 11, find명령은 여기에 원하는되지 않은 하위 디렉토리로 재귀 것이다. 하위 디렉토리를 포함하여 전체 디렉토리 트리를 복사하려면 완전히 다른 질문이며 대답은 훨씬 간단 cp -a dir1 dir2합니다.
Gilles 'SO- 악한 중지'

0

아래는 소스에서 대상 디렉토리로 파일을 복사하는 명령입니다.

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

    $ cp fileName destination directory path

예:

cp publichOT.sh  /data/home/useradmin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.