2009-10-14 5 views
1

모든 첨부 된 폴더에서 읽기 전용 권한을 가진 응용 프로그램 (MyApp.app)을 삭제해야합니다. 삭제하기 전에 모든 묶인 파일/디렉토리의 사용 권한을 0644로 변경해야합니다.이 작업을 재귀 적으로 수행하려면 어떻게해야합니까?Mac OS X에서 루비의 재귀 chmod?

나는

begin; FileUtils.chmod(0644, '#{config.appPath}'); rescue; end 
begin; FileUtils.rm_r('#{config.appPath}'); rescue; end 

을 시도했지만 반복적으로 FileUtils.chmod 작동하지 않습니다. 나는 유닉스 명령을 사용할 수 없다. 루비 여야한다.

편집 : 현재 컨텍스트에서 Unix 명령을 사용할 수 없습니다. 좋아요, 이것은 RubyCocoa 응용 프로그램입니다. 그리고 당신이 보는 소스는 응용 프로그램을 제거하기로되어있는 루비 스크립트의 일부입니다. 제 고객이 가지고있는 코드이기 때문에 주석을 달지 마십시오. 제거는 응용 프로그램의 모든 흔적을 제거하고 프로세스를 종료하며 결국 응용 프로그램 자체를 삭제하는 것을 포함합니다. 일반적으로 작동하지만 어떤 이유로 MyApp.app 폴더에 읽기 전용 권한이있는 경우에는 작동하지 않습니다. 그래서 나는 폴더에서 재귀 적으로 chmod를 실행하고 그것들을 제거한다고 생각했지만, 루비에서는 어떤 이유로 든 똑바로 서 있지는 않습니다. 그래서 제가 도움을 청합니다. 명령 행에서이를 수행하는 방법에 대한 많은 예제가 있지만 코드에서 어떻게 수행합니까? 여기

코드에서 좀 더, 그냥 구현의 방법을 보여줍니다 :

code =<<FOO 
require 'fileutils' 
# kill the app before deleting files in case it writes files on exit 
%x{/bin/kill -9 #{NSProcessInfo.processInfo.processIdentifier}} 
begin; FileUtils.chmod(0644, '#{TBConfig.appPath}'); rescue; end 
begin; FileUtils.rm_r('#{TBConfig.appPath}'); rescue; end 
FOO 
    ff = Tempfile.new('timebridge') 
    ff.write(code) 
    ff.close 
    %x{/usr/bin/ruby #{ff.path}} 

다시 한 번 감사드립니다. 편집 - -

+2

어쨌든 삭제하는 경우 사용 권한을 변경하는 용도는 무엇입니까? –

+0

* 당신이 * 유닉스 명령 *을 사용할 수 없다고 말하면 혼란 스럽습니다. 당신은 OSX에 있습니다. 유닉스 명령은 거기에서 완벽하게 작동합니다. 이 숙제가 있니? (그 외에도 Jeff는 맞습니다. 삭제하려는 항목에 대한 권한을 변경할 이유가 없습니다.) – Telemachus

+0

MyApp.app에 모든 닫힌 폴더에 대한 읽기 전용 권한이 있으면 삭제할 수 없습니다. 더 자세한 설명은 편집을 참조하십시오. 아니 숙제가 아니에요 ... –

답변

6

FileUtils.chmod_R는

http://www.ruby-doc.org/core/classes/FileUtils.html#M004351

해야

[email protected] ~ $ mkdir -p foo/bar/seth 

[email protected] ~ $ ls -ld foo 
drwxr-xr-x 3 seth staff 102 Oct 15 19:24 foo 

[email protected] ~ $ ls -ld foo/bar 
drwxr-xr-x 3 seth staff 102 Oct 15 19:24 foo/bar 

[email protected] ~ $ ls -ld foo/bar/seth 
drwxr-xr-x 2 seth staff 68 Oct 15 19:24 foo/bar/seth 

[email protected] ~ $ cat test.rb 
require 'fileutils' 
begin; FileUtils.chmod_R(0777, 'foo'); rescue; end 

[email protected] ~ $ ruby test.rb 

[email protected] ~ $ ls -ld foo 
drwxrwxrwx 3 seth staff 102 Oct 15 19:24 foo 

[email protected] ~ $ ls -ld foo/bar 
drwxrwxrwx 3 seth staff 102 Oct 15 19:24 foo/bar 

[email protected] ~ $ ls -ld foo/bar/seth 
drwxrwxrwx 2 seth staff 68 Oct 15 19:24 foo/bar/seth 

빠른 테스트 작업이 나타납니다.

+0

그것은 어떤 이유로 재귀 적으로하지 않습니다. –

+0

나는 내 편이 똑같은 시험을 치르게 될 것이다. 윌 당신이 알려 드리겠습니다. 감사합니다. –

+0

@ 세스, 고맙습니다. 내가 그것을 시도했을 때 어떤 이유로,하지만 아마 내가 제대로 사용하지 않았다. –