디렉토리 1의 내용을 디렉토리 2로 복사하고 싶습니다. 그러나 디렉토리 1의 파일 (디렉토리가 아닌) 만 복사하고 싶습니다. 어떻게해야합니까?
cp dir1/* dir2/*
그런 다음 여전히 디렉토리 문제가 있습니다.
또한 모든 파일에는 확장자가 없으므로 . 트릭을하지 않습니다
cp dir1/* dir2
또는cp -t dir2 dir1/*
디렉토리 1의 내용을 디렉토리 2로 복사하고 싶습니다. 그러나 디렉토리 1의 파일 (디렉토리가 아닌) 만 복사하고 싶습니다. 어떻게해야합니까?
cp dir1/* dir2/*
그런 다음 여전히 디렉토리 문제가 있습니다.
또한 모든 파일에는 확장자가 없으므로 . 트릭을하지 않습니다
cp dir1/* dir2
또는cp -t dir2 dir1/*
답변:
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로 종료됩니다.
cp
일치하는 파일을 복사합니다 . 따라서이 동작은 새로운 것이 아니며 (SuSE 8.1은 2002 년부터) Linux로 제한되지도 않습니다. 지시받은 모든 것을 할 수 없기 때문에 0이 아닌 종료 코드로 종료합니다 . 그렇다고 아무것도 하지 않는다는 의미는 아닙니다 . dir1/*
cp
cp
&&
하면 문제가 발생할 수 있으므로 주목할 가치가 있다고 생각했습니다 . 나는 지금 상황을 기억할 수 없지만 이런 식으로 노력하고있었습니다.
*
숨겨진 파일 포함 여부 또는 숨겨진 파일 포함 방법은 셸에 따라 다릅니다. 에 *
숨겨진 파일이 포함 되어 있지 않으면와 일치시킬 수 있습니다 .*
. 이 포함되므로주의 .
와 ..
에 bash
와 dash
있지만에 zsh
. 이 답변의 맥락에서 당신은 멀리 얻을 수 cp dir1/* dir1/.* dir2
있기 때문 .
및 ..
디렉토리하며 복사되지 않습니다. zsh
로 숨겨진 파일을 포함하도록 만들 수도 있습니다 *(D)
.
명령이 아닌 와일드 카드를 확장하는 쉘입니다. 따라서 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
. 또한 대상 디렉토리에서 원래 디렉토리 계층을 재귀 적으로 복사하고 보존하는 방법이 있습니까?
-maxdepth 1
1, find
명령은 여기에 원하는되지 않은 하위 디렉토리로 재귀 것이다. 하위 디렉토리를 포함하여 전체 디렉토리 트리를 복사하려면 완전히 다른 질문이며 대답은 훨씬 간단 cp -a dir1 dir2
합니다.