복사 명령을 사용하여 디렉터리와 모든 하위 디렉터리의 모든 .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 \;
-exec
cp
발견된 모든 파일에 대해 실행합니다.
{}
.h
은 발견된 각 파일의 경로로 대체되며 --parents
파일의 상위 디렉토리가 libtensorflowlite-2.13.0-linux/include
존재하지 않는 경우 대상 디렉토리에 생성되는지 확인합니다.