2

我对 mac shell 脚本非常陌生,但我写这个是为了在 mac 上切换隐藏/显示隐藏文件。(然后装上自动机应用程序)这是一个好的解决方案吗?

#!/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
4

5 回答 5

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 信号,该信号通常可以被进程捕获以干净地终止。从 10.8 开始,Finder 不支持突然终止,但如果支持,即使发送 KILL 信号也应该是安全的。

于 2013-08-17T12:34:28.303 回答
2

如果您想在 Mac 的终端中快速显示/隐藏隐藏文件,请将以下行添加到您.bash_profile的主目录中的文件中:

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
于 2015-03-22T16:50:57.707 回答
1

而不是killall Finder, 这有点极端和危险(您可能会在文件复制或其他 I/O 操作的中间杀死 Finder)。相反,您可以只向 Finder 发送一个 AppleEvent 来告诉它刷新给定的窗口。例如,要刷新最前面的窗口,您可以在 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
于 2011-10-14T10:13:10.007 回答
1

这个问题很老,但这是使用您的代码的一个很好的解决方案:

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

这是关闭 finder 的类似方法,但比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'
于 2013-08-16T17:35:17.560 回答
1

对于它的价值,我在我的 .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"'
}

所以我可以从终端调用它。(注意,如果您在AppleShowAllFiles从未设置过的机器上运行它,那么您第一次运行它时会收到投诉,ala:

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

但一切都会好起来的。我相信它NSGlobalDomain默认存在,但这会将它设置为用户的。)

于 2014-07-11T23:52:41.280 回答