解决讨厌的.DS_Store文件(上)
# 前言
使用 macOS 的操作系统的人都知道,系统经常会自动在每个目录生成一个隐藏的 .DS_Store 文件。.DS_Store (Desktop Services Store) 是一种由苹果公司的 Mac OS X 操作系统所创造的隐藏文件,目的在于存贮目录的自定义属性,例如文件们的图标位置或者是背景色的选择。相当于 Windows 下的 desktop.ini。删掉后会自动重新生成,如何优雅地解决它?
# 为什么要搞它
留着不是挺好的吗?一些自以为没有强迫症的人可能会以这种心态去保留它。其实不然,在 Git、SVN 甚至最基本的U盘拷贝文件夹的时候还是会把这个文件提交上去,然而这个文件一点卵用都没有,跟项目一点关系也没有。
如果不处理,每次拷贝给你同事的文件里都会包含有这个文件,或者上传网页的时候,应该把这个文件删除比较妥当,因为里面包含了一些你不一定希望别人看见的信息。(尤其是网站,通过 .DS_Store 可以知道这个目录里面所有文件的清单,很多时候这是一个不希望出现的问题。)
<?php //例子
$filepath = "images";
$handle = opendir($filepath);
while (false != ($file = readdir($handle))) {
if ($file != "." && $file != ".." && $file != ".DS_Store" && $file != "index.html" && $file != "index.htm" && $file != "index.php") {
if ($output) $output .= "|";
$output .= "$file";
}
}
closedir($handle);
echo "&files=$output&"; //输出遍历此文件夹所有的内容
?>
2
3
4
5
6
7
8
9
10
11
12
# 删除、禁止生成
- 删除当前目录的 .DS_store
find . -name '*.DS_Store' -type f -delete
- 删除所有目录的 .DS_store
sudo find / -name ".DS_Store" -depth -exec rm {} \;
- 禁止 .DS_store 生成
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
- 恢复 .DS_store 生成
defaults delete com.apple.desktopservices DSDontWriteNetworkStores
遗憾的是,这里的禁止生成的命令只有在网络共享的时候有效,也就是在本地无效。比如拖动一下图标的位置或者标记一下就会自动生成了,不是我们所理想的禁止生成,所以还是需要针对本地进行处理。
# Git Ignore
需要在 .gitignore 文件中添加 .DS_Store,当然这里的 .gitignore 不是指每个项目中的 .gitignore,而是本地 git 目录下的 .gitignore,默认是在用户文件目录下,如 /Users/bingo/.gitignore
简单粗暴的做法
echo .DS_Store >> ~/.gitignore
更优雅的做法
1.创建 ~/.gitignore_global 文件,把需要全局忽略的文件类型塞到这个文件里
# .gitignore_global
####################################
######## OS generated files ########
####################################
.DS_Store
.DS_Store?
*.swp
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
####################################
############# packages #############
####################################
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2.在 ~/.gitconfig 中引入 .gitignore_global
[filter "lfs"]
required = true
clean = git-lfs clean %f
smudge = git-lfs smudge %f
[user]
name = bingozb
email = 454113692@qq.com
[core]
excludesfile = /Users/bingo/.gitignore_global
2
3
4
5
6
7
8
9
这样,以后就不用每次都在项目中的 .gitignore 文件中添加 .DS_Store了,类似“继承”。而每个项目中的 .gitignore 只需要根据情况引入一些针对项目要过滤的文件名就可以了。
# 后话
另外,在 macOS Sierra 10.12 上,已经隐藏这个 .DS_store 文件了,可能是苹果也发现它的恶心之处了吧,从用户体验的角度出发做了优化。但其实还是存在的,我开了虚拟机在 Windows 上就可以看到这个文件。所以即便在最新的系统下,仍然有必要对这个恶心的 .DS_store 做处理。