2013-07-23 3 views
0

면책 조항 :이 질문은 Unity3D and its library issue (으)로 인해 존재합니다.수정 시간이 mingw 인 파일 목록을 쉘 스크립트하는 방법은 무엇입니까?

나는 current git-cache-meta.sh을 얻고 Windows에서 사용하려고 시도했습니다. 작동하지 않습니다.

내가 가진 첫 번째 오류는이 라인에 있던 : 원래 find $(git ls-files)로 변경

$ find `git ls-files` 
find: invalid predicate `-' 

는 작동하지 않습니다 (즉, 두 구문이 좋지 않습니다).

invalid predicate은 확실히 "boo - foo.bar"과 같은 파일 때문입니다. 그래서 find "$(git ls-files)"을 실행하려고했습니다. 그런 다음 very ugly error/bug으로 바뀌 었습니다.

내가 알고 싶은 이유 command substitution (이상한 $() 더 중요한 와 Mingw하지만, 작동하지 않습니다 : mingw에 제대로

우리가 어떻게 할 수

git-cache-meta.sh? 아래에서 볼 수 있듯이

, 실제로 해당 키워드없이 대답을 관리 ->제대로. 그래서 나는 여전히 누군가가 빠르고 깨끗한 해결책을 찾을 수 있기를 희망한다. < - 나는이 스크립트를 처음부터 사용하고있다.

답변

1

원본 스크립트는 우아하고 복잡한 스타일로 작성되었습니다 (아마도 필요한 것 이상). 나는 대부분의 복잡성을 제거하고 그것을 다시 썼다. 나는와 Mingw에 침입하는 기능 모르겠지만,이 일을 할 가능성이 높습니다 :

시스템의 실행 파일 중 하나가 모두를 지원하지 않는 경우
GIT_CACHE_META_FILE=.git_cache_meta 
case [email protected] in 
    --store) 
     git ls-files|while read file; do 
      find "$file" \(-printf 'chown %U %p\n' \) \ 
       \(-printf 'chgrp %G %p\n' \) \ 
       \(-printf 'chmod %#m %p\n' \) \ 
       \(-printf 'touch -c -d -m "%TY-%Tm-%Td %TH:%TM:%TS" "%p"\n' \) 
     done | tee $GIT_CACHE_META_FILE 
     ;; 
    --apply) 
     sh -e $GIT_CACHE_META_FILE 
     ;; 
    *) 
     echo "Usage: $0 --store|--apply"; exit 1 
     ;; 
esac 

잘못 갈 가능성있는 유일한 방법은있다 여기에 사용 된 것보다 그것은 find, chown, chgrp, touch 및 chmod입니다.

+0

이것은 ** 놀라운 두려움입니다 ** !! 나는 여전히 모든 것을 한가운데에 멈추게하는 이상한 오류를 갖지만 이것은 정확히 내가 물어 본 것인데 원래보다이 방법으로 작업하는 것이 훨씬 낫다. ! 고마워. – cregox

+0

나는 그것에 대해, 나는 몇 가지를 바꿀 것이다 : (1)'티 '를 제거하고 똑바로 리디렉션을 사용하십시오 (http://linuxcommand.org/lts0060.p hp)'>'이 빠르면 (또는 그렇지 않으면'>/dev/null'을 추가하십시오.) (2)'find'를 제거하고 다른 것을 사용하십시오. 'find '는'MinGW'의 모든 범인이며, 결함이있는 구현입니다. 앞에서 언급했듯이, 스택에'STATUS_ACCESS_VIOLATION'이 덤프 된 경우 문제가 발생합니다. 그래서, 예를 들어'touch '에 대한 줄은 다음과 같을 수 있습니다 :'echo "touch -c -d -m \"$ (date -r "$ file"+'% F % T ') \ "\"$ 파일 \ ""; "(내가 대답 한 것처럼). 다시 한번 고마워요, piojo! – cregox

+0

다행 조금 도와 줬어. 나는 "find"사용법을 제거 할 수 없었다. 왜냐하면 그 라인에서 요청 된 모든 메타 데이터를 얻는 다른 방법을 알지 못했기 때문에 어떤 메타 데이터가 필요한지 실제로 알지 못했다. – piojo

0

MinGW는 캐리지 리턴 (CR, \r)을 각 줄의 끝에 추가하는 기본 Windows 도구를 호출하기를 좋아합니다. 따라서 $(commandname)$(commandname | sed $'s/\r$//') 또는 이와 유사한 것으로 바꿀 수 있습니다.

다른 옵션은 Interix/SFU/SUA 또는 Cygwin 또는 MSYS 또는 AT & T UWIN과 같은 더 많은 Unix-y를 시도하는 것입니다.

일반적으로 메타 데이터에 관해서는, 문제는 NTFS가있다 반면에, 특히 FAT 파일 시스템에 물건 같은 chown, chgrp, chmodtouch는 윈도우 플랫폼에서 다르게 행동하며, 몇 가지도 존재하지 않을 것입니다 Unix 사용자/그룹/다른 권한 대신에 타임 스탬프와 다른 형식의 ACL, 다른 형식의 메타 데이터와 완전히 다른 메타 데이터 세트를 제공하므로 유닉스 스크립팅 세계 NT 플랫폼을 잘 이해하는 사람으로부터 개발 작업이 필요할 수 있습니다.

마지막으로,이 스크립트는 저장된 명령을 평가하기 때문에 보안상의 문제가 있습니다. 따라서 다른 사람이 .git_cache_meta 파일에 쓸 수있는 권한을 갖고 있으면 시스템을 소유하게됩니다.

+0

(1) CR에 대한 멋진 아이디어! 그러나'| sed $ 's/\ r $ //''이 (가) 작동하지 않았습니다. (2)'mingw'는'git'에 포함되어 있기 때문에 사용하고 있습니다. 그래서 나는 다른 것을 사용하고 싶지 않습니다. (왜냐하면 저는 자식을 만들려고하기 때문입니다). (3)'touch'는 잘 작동하는 것 같습니다. 나는 나머지를 돌보지 않지만 문제없이 일하는 것 같다. (4) 젠장, 나는 이런 종류의 구멍에 대해서 생각조차하지 않을 것이다 ... 어떤 경우 에라도 누군가가 악의적 인 사람이 그 파일에 접근 할 수 있다면 그는 이미 다른 곳에서 훨씬 더 나쁜 구멍을 발견했다. (마침내) 지금까지 나는이 대답을 전혀 사용할 수 없었다. :(하지만 고마워요. – cregox

+0

또한, 나는 이론 (1)을 시도하고'git ls-files> textfile'을했습니다. 어떻게해도 텍스트 파일은 어떤 CR도 가져 오지 않습니다. 단지 LF (또는 "0a ", 또는 ASCII 10). 그래서 아마도 문제가되지 않습니다. 또한 오류가 **''-"'**를 가리키고 있으므로 MinGW *가 포함하는 파일 이름을 올바르게 해석하지 못하고있는 것 같습니다. 어떤 이유로 든 명령 대체 아래 하이픈 – cregox

+1

OK 죄송 합니다만, 분명히 이것은 당면한 문제가 아니 었습니다. (문제가되는 것을 보았습니다. 그래서 제안했습니다.) 행운을 빌어 요. ! – mirabilos

1

커다란 복잡하고 복잡한 포트와 느린 솔루션을 발견했습니다. 너무 느린. 너무 느려. 약 9k 개 파일이있는 내 git을 탐색하려면 1 분 정도 소요됩니다. 그러나 아무도 덜, 여기에, thanks to Dave Taylor, 구글과 많은 맨 페이지입니다. 기본적으로, find 대신 for와 데이브의 해킹을 사용

git ls-files -d > .temp_gitcachemeta 
for s in $(git ls-files | grep -vf .temp_gitcachemeta | sed 's/ /_+_/g'); 
    do t="$(echo $s | sed s'/_+_/ /g')"; 
    echo "touch -c -m -d \"$(date -r "$t" +'%F %T')\" \"$t\""; 
done 
rm .temp_gitcachemeta ;; 

와 Mingw도 process substitution를 지원하지 않는 것처럼 보이기 때문에 여기에 임시 파일을 사용하여.