하위 디렉터리는 유지하면서 일치하는 파일만 복사하는 방법

하위 디렉터리는 유지하면서 일치하는 파일만 복사하는 방법

이를 수행할 수 있는 방법이 있습니까?"폴더 구조를 유지하면서 디렉터리에서 파일의 하위 집합을 복사하는 방법은 무엇입니까?", 하지만 rsync를 사용하지 않습니까?

cp, find 및 grep만 사용하여 수행할 수 있습니까?

내 bash 쉘은 매우 제한적입니다. 즉, Windows에서는 git 쉘이므로 :( ) rsync는 옵션이 아닙니다.

cygwin을 구할 수 있다는 것은 알지만, 이 제한된 상황에서 무엇을 할 수 있는지 알고 싶습니다.

답변1

tar또는 cpio또는 (둘 중 하나를 사용할 수 있는 경우) 을 사용하여 특정 파일을 복사하고 pax필요한 경우 대상 디렉터리를 만들 수 있습니다. GNU tar를 사용하여 *.txt이름이 지정되었거나 현재 디렉토리에 있는 모든 일반 파일을 아래의 동일한 계층 구조로 복사합니다.README.*../destination

find . -type f \( -name '*.txt' -o -name 'README.*' \) |
tar -cf - -T - |
tar -xf - -C ../destination

find, cp및 shell을 사용하면 mkdir루프를 사용하여 원하는 파일을 반복 find하고 쉘 명령을 실행하여 각 파일을 복사할 수 있습니다. 이는 느리고 번거롭지만 이식성이 뛰어납니다. 셸 조각은 의 대상 루트 디렉터리 $0와 의 소스 파일 경로를 수신 $1하고 필요에 따라 대상 디렉터리 트리를 생성한 다음(아래 코드는 디렉터리 권한을 유지하지 않음) 파일을 복사합니다. 다음 코드 조각은 모든 POSIX 시스템 및 대부분의 BusyBox 설치에서 작동합니다.

find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c '
  mkdir -p "$0/${1%/*}";
  cp -p "$1" "$0/$1"
' ../destination {} \;

통화를 그룹화 할 수 있습니다 sh. 좀 더 복잡하지만 더 빠를 수도 있습니다.

find . -type f \( -name '*.txt' -o -name 'README.*' \) -exec sh -c '
  for x; do
    mkdir -p "$0/${x%/*}";
    cp -p "$x" "$0/$x";
  done
' ../destination {} +

bash가 4 이상인 경우(Git Bash가 충분히 새로운지 여부는 모르겠습니다) 를 호출할 필요가 없으며 glob 모드를 사용하여 하위 디렉터리로 재귀할 find수 있습니다 .**

shopt -s globstar extglob
for x in **/@(*.txt|README.*); do
  mkdir -p "../destination/${x%/*}"
  cp -p -- "$x" "../destination/$x"
done

답변2

다음과 같이 시도해 볼 수 있습니다.

ls | grep 2 | xargs -n1 -t -i cp -R {} ../testdirTwo/{}

내 Linux에서 시도했는데 작동합니다. 원할 경우 재귀에 사용되는 cp의 -R 매개변수에 유의하세요. 또한 {}를 배치한 위치에 출력을 삽입하는 -i 매개변수 o xargs에 유의하세요. -t는 명령을 stderr에 반영하기 위한 것입니다.

내 테스트 디렉터리 구조는 다음과 같습니다.

$ find .
.
./2
./2/f2
./1
./1/f1
./f1
./f2

관련 정보