cp some/path/**/*.h는 모든 깊이에서 .h 파일을 제외합니다.

cp some/path/**/*.h는 모든 깊이에서 .h 파일을 제외합니다.

복사 명령을 사용하여 디렉터리와 모든 하위 디렉터리의 모든 .h 파일을 다른 폴더로 복사하려고 합니다.

cp --parents -r tensorflow/lite/**/*.h libtensorflowlite-2.13.0-linux/include

위의 glob은 .h 파일만 복사하며 tensorflow/lite/XXX/*.h더 아래(예: tensorflow/lite/XXX/XXX.h) 또는 tensorflow/lite/*.h루트 디렉터리( )에 있는 .h 파일을 포함하지 않습니다. 이 문제를 해결하려면 cp예상되는 모든 재귀 수준에 대해 여러 명령을 실행 해야 합니다 .

cp --parents -r tensorflow/lite/*.h libtensorflowlite-2.13.0-linux/include
cp --parents -r tensorflow/lite/**/*.h libtensorflowlite-2.13.0-linux/include
cp --parents -r tensorflow/lite/**/**/*.h libtensorflowlite-2.13.0-linux/include
cp --parents -r tensorflow/lite/**/**/**/*.h libtensorflowlite-2.13.0-linux/include

나는 여기서 분명한 것을 놓치고 있다는 것을 알고 있습니다. ".h로 끝나는 모든 하위 디렉터리의 모든 파일"을 반복적으로 나타내는 glob을 만드는 더 쉬운 방법이 있습니까?

답변1

**/1992 zsh 셸의 모든 하위 디렉터리 수준과 일치합니다.

ksh93은 2003년에 이를 복제했지만 이전 버전과의 호환성을 위해 기본적으로 비활성화했으며( 이전 **과 동일 *) set -G/enabled 를 전달했습니다 set -o globstar. bash는 2009년에 이 기능을 추가한 마지막 셸 중 하나였지만 ksh93과 같은 방식으로 구현되었으며(5.0 이전에는 가짜였지만) shopt -s globstar.

그래서:

cp --parents tensorflow/lite/**/*.h libtensorflowlite-2.13.0-linux/include

이는 zsh에서 작동하지만(또는 zsh와 약간 다르게 작동하지만 fish기본적으로 어느 정도 활성화되어 있음) 먼저 다른 셸에서 옵션이나 이에 상응하는 옵션을 활성화 **해야 합니다 .globstar

set   -o globstar      # ksh93
set   -o extended-glob # yash
set      globstar      # tcsh
shopt -s globstar      # bash

자세한 내용은 다음을 참조하세요.ls * , ls ** 및 ls *** 의 결과

답변2

.h이 명령은 해당 하위 디렉터리 에 있는 모든 파일을 찾아 tensorflow/lite해당 파일과 해당 상대 경로를 대상 디렉터리에 복사합니다 libtensorflowlite-2.13.0-linux/include.

find tensorflow/lite -type f -name "*.h" -exec cp --parents {} libtensorflowlite-2.13.0-linux/include/ \;

find tensorflow/lite

  • 디렉토리에서 검색을 시작합니다 tensorflow/lite.

-type f

  • 디렉토리가 아닌 파일만 찾도록 find에 지시합니다.

-name "*.h"

  • 확장자가 .h인 파일만 고려하도록 지정합니다.

-exec cp --parents {} libtensorflowlite-2.13.0-linux/include \;

  • -execcp발견된 모든 파일에 대해 실행합니다.

{}.h은 발견된 각 파일의 경로로 대체되며 --parents파일의 상위 디렉토리가 libtensorflowlite-2.13.0-linux/include존재하지 않는 경우 대상 디렉토리에 생성되는지 확인합니다.

관련 정보