패턴과 일치하는 디렉터리에 중첩된 파일을 복사하는 방법은 무엇입니까?

패턴과 일치하는 디렉터리에 중첩된 파일을 복사하는 방법은 무엇입니까?

이 패턴과 일치하는 하위 디렉터리에서 파일을 복사하려고 합니다.

vendor/plugin/*/tasks/*.rake

폴더에 넣어

lib/tasks

답변1

간단하게 들리네요:

cp vendor/plugin/*/tasks/*.rake lib/tasks

또는 첫 번째 항목이 *전체 하위 트리와 일치해야 하는 경우 다음과 같은 방법을 사용하세요.

find vendor/plugin -path "*/tasks/*.rake" -exec cp "{}" lib/tasks +

답변2

파일을 덮어쓰는 대신 이름 충돌에 대한 알림을 받아 이름 충돌(예: vendor/plugin/a/tasks/1.rake및 사이의 충돌) 을 처리하려는 경우 셸 루프를 사용합니다.vendor/plugin/b/tasks/1.rake

destdir=lib/tasks

for pathname in vendor/plugin/*/tasks/*.rake
do
    destpath=$destdir/${pathname##*/}

    if [ -e "$destpath" ]; then
        printf 'Can not move "%s", "%s" is in the way' \
            "$pathname" "$destpath" >&2
        continue
    fi

    cp "$pathname" "$destpath"
done

destpath=$destdir/${pathname##*/}

다음과 같이 쓸 수도 있습니다.

destpath=$destdir/$(basename "$pathname")

대상의 경로 이름을 구성하여 이미 사용되었는지 확인하세요.

당신은 또한 이것을 할 수 있습니다

cp -i vendor/plugin/*/tasks/*.rake lib/tasks

유틸리티 자체에서 각 이름 충돌에 대한 대화형 프롬프트를 얻습니다 cp. 이 명령은 vendor/plugin/*/tasks/*.rake명령줄에서 패턴 확장에 의존하며 확장된 경로 이름 수에 따라 "인수 목록이 너무 깁니다" 오류가 발생할 수 있습니다. 이 경우 루프를 대신 사용할 수 있습니다.

for pathname in vendor/plugin/*/tasks/*.rake
do
    cp -i "$pathname" lib/tasks
done

이 루프는 이 답변의 초기 루프와 거의 동일합니다. 유일한 차이점은 cp이름 충돌이 발생할 때 유틸리티가 사용자에게 메시지를 표시한다는 것입니다.

위의 모든 변형은 패턴이 vendor/plugin/*/tasks/*.rake실제로 무엇인가와 일치하고 대상 디렉터리가 lib/tasks이미 존재한다고 가정합니다. 나는 또한 당신이 숨겨진 이름을 가진 하위 디렉토리나 파일에는 관심이 없다고 가정합니다.

관련 정보