2011-10-14 104 views
2

我很新的mac shell脚本,但我已经写了这个在Mac上切换隐藏/显示隐藏的文件。 (然后穿上automator应用程序)这是一个很好的解决方案吗?Mac shell脚本来隐藏/显示隐藏的文件

#!/bin/sh 

view=$(defaults read com.apple.finder AppleShowAllFiles) 

if [ "$view" = "1" ] 
then 
defaults write com.apple.finder AppleShowAllFiles -bool false 
else 
defaults write com.apple.finder AppleShowAllFiles -bool true 
fi 
killall Finder 
+0

杀害查找过程是一个有点极端 - 如果Finder是在做某件事的中间会发生什么? –

+0

可能有点极端,但无法从隐藏文件更改为显示的文件(并返回)而无需重新启动查找程序。 –

+0

我希望你有支持! –

回答

1

相反的killall Finder,这是有点极端和危险的(您可以在文件拷贝或其他I/O操作的中间杀查找)。相反,你可以发送一个AppleEvent给Finder,告诉它刷新给定的窗口。例如。刷新最前面的窗口,你可以在AppleScript的做到这一点:

tell application "Finder" 
    tell front window 
    update every item with necessity 
    end tell 
end tell 

(从http://hints.macworld.com/article.php?story=2009091413423819

您可以轻松地适应这个刷新每个打开Finder窗口,如果这就是你所需要的。

要从bash脚本运行上述AppleScript代码,您可以使用osascript命令行工具,例如,

osascript <<EOF 
tell application "Finder" 
    tell front window 
    update every item with necessity 
    end tell 
end tell 
EOF 
+0

当我尝试运行'默认写入com.apple.finder AppleShowAllFiles -bool true; osascript -e'告诉应用程序“Finder”的窗口用更新项目来更新项目,隐藏的文件没有在Finder中显示。我错过了什么吗? – user495470

1

这个问题是老了,但这里的使用你的代码很好的解决方案:关闭取景器

osascript -e 'tell app "Finder" to quit' 

这是类似的方法,但比Paul R的回答更加简洁。保罗,如果你看到这个,我错过了任何潜在的问题,告诉我。

或者,你可以使用:

STATUS=`defaults read com.apple.finder AppleShowAllFiles` 
if [ $STATUS == TRUE ]; 
then 
defaults write com.apple.finder AppleShowAllFiles FALSE 
else 
defaults write com.apple.finder AppleShowAllFiles TRUE 
fi 
osascript -e 'tell app "Finder" to quit' 
2

我使用的脚本是这样的:

do shell script "x=$(defaults read com.apple.finder AppleShowAllFiles) 
[ $x = 1 ] && b=false || b=true 
defaults write com.apple.finder AppleShowAllFiles -bool $b" 
tell application "Finder" 
    quit 
    delay 0.1 -- without this there was a "connection is invalid" error 
    launch -- without this Finder was not made frontmost 
    activate -- make Finder frontmost 
    reopen -- open a default window 
end tell 

我不知道,如果killall Finder将是危险的要么。它向Finder发送一个TERM信号,通常可以被一个进程捕获以便干净地终止。 Finder不支持从10.8开始的突然终止,但如果发生这种情况,则应该可以安全地发送一个KILL信号。

0

对于什么是值得的,我在我的.bash_profile这样做的以下,类似@SwankyLegg

togglehidden() { 
    STATUS=`defaults read com.apple.finder AppleShowAllFiles` 
    if [ $STATUS == TRUE ]; 
    then 
    defaults write com.apple.finder AppleShowAllFiles FALSE 
    else 
    defaults write com.apple.finder AppleShowAllFiles TRUE 
    fi 
    osascript -e 'tell app "Finder" to quit' 
    sleep 1 
    osascript -e 'launch app "Finder"' 
} 

,所以我可以从终端调用它。 (NB,如果你在那里AppleShowAllFiles从未设置的机器上运行它,你会得到一个投诉你运行它的第一次,鼻翼:

XXXXXXXXX defaults[2228:124111] 
The domain/default pair of (/Users/xxx/Library/Preferences/com.apple.finder, AppleShowAllFiles) does not exist 

但一切都会好,我相信它的生命。在NSGlobalDomain默认情况下,但这将其设置在用户的。)

2

如果你想有一个快速的方法来显示/隐藏在Mac的终端隐藏文件,添加以下行到.bash_profile文件在你的home目录:

alias hidden-files-show="defaults write com.apple.finder AppleShowAllFiles YES; killall Finder"; 
alias hidden-files-hide="defaults write com.apple.finder AppleShowAllFiles NO; killall Finder"; 

关闭并打开一个新的终端窗口新alias命令生效,那么你就可以快速输入“功不可没” -Tab自动完成

$ hidden-files-show 
$ hidden-files-hide