디렉토리 트리의 모든 HTML 파일을 단일 디렉토리에 복사하는 방법

디렉토리 트리의 모든 HTML 파일을 단일 디렉토리에 복사하는 방법

.html모든 파일 myDir과 해당 하위 디렉터리를 에 복사하고 싶습니다 ~/otherDir. 시도해 보았지만 작동하지 않습니다.

$ find myDir -name *.html -print | xargs -0 cp ~/otherDir
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ... target_directory

답변1

먼저, 쉘이 "*"와 일치합니다. 이스케이프 \또는 따옴표를 사용하십시오 .*.html

이와 같이:

find myDir -name "*.html"또는find myDir -name \*.html

xargswith 스위치 find를 사용하여 건너뜁니다 -exec.

find myDir -name "*.html" -exec cp {} ~/otherDir \;

{}이는 발견된 파일을 대체 find하고 일치하는 항목마다 한 번씩 수행하기 때문에 작동합니다 .

또한 이렇게 하면 소스 디렉터리의 복사본이 평면화됩니다. 예:

myDir/a.html
myDir/b/c.html

생산할 것이다

otherdir/a.html
otherdir/c.html

답변2

.html그러면 특정 소스 디렉터리와 그 하위 디렉터리에 있는 모든 파일을 단일 디렉터리에 복사 하고 싶습니까 (즉, 계층 구조 축소)?

POSIX기준:

find myDir -name '*.html' -type f -exec sh -c 'cp "$@" "$0"' ~/otherDir {} +

중간 쉘 은 ~/otherDir매개변수 0이 되어 소스 파일을 "$@". 쉘 외부에 대상 디렉토리를 두면 대상 디렉토리가 상위 쉘 스크립트( )의 변수인 경우 참조 문제가 발생하지 않는다는 추가 이점이 있습니다 -exec sh -c 'cp "$@" "$0"' "$target".

다음이 없는 구형 시스템의 경우 find … -exec … +:

find myDir -name '*.html' -type f -exec cp {} ~/otherDir \;

내 쉘은 bash ≥4 또는 zsh입니다.

shopt -s globstar  # only for bash, put it in your `.bashrc`
cp myDir/**/*.html ~/otherDir/

답변3

find myDir -name '*.html' -print0 | xargs -0 -J % cp % ~/otherdir

답변4

OSX는 조회를 위해 -execdir을 지원합니까?

 find ./myDir -name "*.html" -execdir cp {} /abspath/to/otherDir ";"

Gnu/find는 대부분의 경우 -exec 대신 -execdir을 사용할 것을 권장합니다.

관련 정보