작업하기 어려운 매우 큰 소스 코드 디렉토리 구조가 있습니다. 나에게 더 잘 맞는 Maven 구조로 변환하는 도구를 실행하고 싶습니다. 작업을 마쳤을 때 도구를 다시 실행하여 Maven 구조를 원래의 열악한 구조로 다시 변환했습니다. 저는 다양한 쉘에 매우 익숙하며 수백 개의 cp 명령을 사용하여 스크립트를 작성할 수 있습니다. 그러나 이는 유지하기 어려울 것이다.
Perforce의 점 3개 와일드카드와 같은 것을 사용하여 파일을 이동하거나 복사할 수 있기를 원합니다.
현재 작업 디렉터리와 모든 하위 디렉터리의 모든 파일과 일치합니다. (슬래시를 포함하여 모든 항목과 일치하며 하위 디렉터리에서 이 작업을 수행합니다)
그러면 내 스크립트에는 다음과 같은 명령이 포함됩니다.
cp src/.../foobar/.../*.java trusted/src/main/java/.../foobar/.../*.java
아이디어는 하위 트리의 구조를 유지하면서 디렉토리의 하위 트리를 이동하는 것입니다.
어떤 아이디어가 있나요?
Gilles의 rsync 솔루션에 대해 질문이 있습니다. 다음은 테스트 스크립트입니다.
#!/bin/bash
rm -rf source
mkdir -p source/server/src/com/bodhi/foobar/this
mkdir -p source/server/src/com/bodhi/foobar/that
mkdir -p source/server/src/com/bodhi/other
echo "Hello World" > source/server/src/com/bodhi/foobar/this/A.java
echo "Hello World" > source/server/src/com/bodhi/foobar/that/B.java
echo "Hello World" > source/server/src/com/bodhi/other/C.java
rm -rf target
mkdir -p target/foobar/src/main/java
rsync \
--include='**/foobar/**/*.java' \
--include='**/foobar/**/' \
--exclude='*' \
--prune-empty-dirs \
source/server/src/ target/foobar/src/main/java/
답변1
이 와일드카드는 ksh93, bash ≥4.3(트리의 디렉터리에 대한 심볼릭 링크가 없는 경우 ≥4.0) 및 zsh에 존재합니다. 철자가 입니다 **
. ksh93에서는 먼저 활성화해야 합니다 set -o globstar
. Bash에서는 먼저 shopt -o globstar
.
ls -l src/**/foobar/**/*.java
그러나 그것은 사본을 만들지 않습니다. 대상은 와일드카드 일치가 없는 cp
단일 디렉터리입니다 . 단일 명령을 사용하여 파일을 다른 위치로 끌어서 놓을 cp
수 없습니다 .cp
당신은 그것을 사용할 수 있습니다동기화대신에. 소스 트리의 루트와 대상 트리의 루트를 전달하고, 필요한 파일과 이를 가리키는 디렉터리만 복사하도록 포함 및 제외 규칙을 정의합니다. Rsync는 또한 패턴과 일치하는 경우 빈 디렉토리를 복사하며 이를 사용하여 삭제할 수 있습니다 --prune-empty-dirs
.
rsync --include='**/foobar/**/*.java' --include='**/' \
--exclude='*' --prune-empty-dirs \
src/ trusted/src/main/java/
사용할 수 있는 또 다른 도구는 다음과 같습니다.공원. pax는 rsync와 달리 POSIX에 의해 정의되므로 표준이지만 일부 Linux 배포판에서는 기본 설치에서 이를 생략합니다(그러나 항상 패키지로 제공됨). 접근 방식은 rsync와 유사합니다. .java
파일을 포함하고 나머지는 제외합니다. 구문은 약간 이상합니다. 이름을 바꾸지 않고 파일을 포함하기 위한 원시 대체 또는 파일을 제외하기 위한 빈 대체가 될 수 있는 패턴 대체를 지정합니다. . 필요에 따라 대상에 선행 디렉터리를 자동으로 생성합니다.
pax -rw -s '/\.java$/&/' -s '/.*//' src/* trusted/src/main/java/