Linux 셸의 간단한 명령줄 루프

Linux 셸의 간단한 명령줄 루프

다음과 같은 폴더의 하위 폴더 4개에 동일한 이름의 파일이 있습니다 build.

  • 출시-iphoneos
  • 릴리스 아이폰 시뮬레이터
  • 디버그 아이폰
  • 디버그 아이폰 시뮬레이터

sdk이 파일을 명령줄에서 폴더의 동일한 디렉터리 구조에 복사하고 싶지만 스크립트를 사용하지 않고 싶습니다.

제가 할 수 있어야 한다고 생각한 것은 다음과 같습니다.

for C in (release debug); for T in (iphoneos iphonesimulator); cp build/$C-$T/*.a sdk/$C-$T

하지만 저는 Linux 사용자가 아니기 때문에 루프를 찾아본 후에도 작동하도록 할 수 없습니다. 한 줄로 꽤 쉽게 할 수 있습니까?

답변1

귀하의 접근 방식에는 몇 가지 문제가 있습니다.

  • (A B)배열 할당(예: )에만 사용할 수 C=(A B)있으며 즉시 생성할 수는 없습니다.

    하지만,~을 위한배열이 필요하지 않으므로 for C in A B잘 작동합니다.

  • for루프 의 올바른 구문 은 입니다 for ... in ...; do ..., done.

이 명령은 정상적으로 작동합니다.

for C in release debug; do for T in iphoneos iphonesimulator; do cp build/$C-$T/*.a sdk/$C-$T; done; done

이를 위해서는 적절한 폴더가 필요합니다.SDK이미 존재하는 것.

그러나 @Robertof가 이미 보여주었듯이 루프 없이 이를 보관하는 방법이 있습니다.


복사하고 싶다면모두디렉터리에서 파일을 검색하는 경우(즉, *.a모든 항목과 일치) 해당 명령을 사용하거나 다음과 같이 약간 단순화할 수 있습니다.

cp -R build/{release,debug}-iphone{os,simulator} sdk

작동 방식:

  • 쉘이 수행됩니다버팀대 확장이므로 실제로 실행될 명령은 다음과 같습니다.

    cp -r build/release-iphoneos build/release-iphonesimulator build/debug-iphoneos build/debug-iphonesimulator sdk
    
  • 스위치 -rCP재귀적입니다. 즉, 파일만 복사하는 것이 아니라 전체 디렉터리를 복사합니다.


`만 복사하려면.ㅏ파일(즉, 다른 파일도 있음)이 있으면 다음 명령을 사용하는 것이 좋습니다.

cd build
cp --parents {release,debug}-iphone{os,simulator}/*.a ../sdk

작동 방식:

  • 이번에도 가새 확장은 이전과 같이 수행됩니다.

  • 스위치 --parentsCP대상에 대한 전체 소스 파일 이름을 사용하십시오. 즉, 의 파일이 release-iphoneos에 복사됩니다 ../sdk/release-iphoneos.


마지막으로 조언 한마디:

실험할 때CP명령을 내릴 때는 항상 -i스위치를 사용하세요. 그것은 만든다CP대화형입니다. 즉, 무엇이든 덮어쓰기 전에 메시지가 표시됩니다.

답변2

노력하다:

cp -R build/{release-iphoneos,release-iphonesimulator,debug-iphoneos,debug-iphonesimulator} sdk/

관련 정보