解决讨厌的.DS_Store文件(上)

前言

使用 macOS 的操作系统的人都知道,系统经常会自动在每个目录生成一个隐藏的 .DS_Store 文件。.DS_Store (Desktop Services Store) 是一种由苹果公司的 Mac OS X 操作系统所创造的隐藏文件,目的在于存贮目录的自定义属性,例如文件们的图标位置或者是背景色的选择。相当于 Windows 下的 desktop.ini。删掉后会自动重新生成,如何优雅地解决它?

为什么要搞它

留着不是挺好的吗?一些自以为没有强迫症的人可能会以这种心态去保留它。其实不然,在 Git、SVN 甚至最基本的U盘拷贝文件夹的时候还是会把这个文件提交上去,然而这个文件一点卵用都没有,跟项目一点关系也没有。

如果不处理,每次拷贝给你同事的文件里都会包含有这个文件,或者上传网页的时候,应该把这个文件删除比较妥当,因为里面包含了一些你不一定希望别人看见的信息。(尤其是网站,通过 .DS_Store 可以知道这个目录里面所有文件的清单,很多时候这是一个不希望出现的问题。)

1
2
3
4
5
6
7
8
9
10
11
12
<?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&"; //输出遍历此文件夹所有的内容
?>

删除、禁止生成

  • 删除当前目录的 .DS_store
1
find . -name '*.DS_Store' -type f -delete
  • 删除所有目录的 .DS_store
1
sudo find / -name ".DS_Store" -depth -exec rm {} \;
  • 禁止 .DS_store 生成
1
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
  • 恢复 .DS_store 生成
1
defaults delete com.apple.desktopservices DSDontWriteNetworkStores

遗憾的是,这里的禁止生成的命令只有在网络共享的时候有效,也就是在本地无效。比如拖动一下图标的位置或者标记一下就会自动生成了,不是我们所理想的禁止生成,所以还是需要针对本地进行处理。

Git Ignore

需要在 .gitignore 文件中添加 .DS_Store,当然这里的 .gitignore 不是指每个项目中的 .gitignore,而是本地 git 目录下的 .gitignore,默认是在用户文件目录下,如 /Users/bingo/.gitignore

简单粗暴的做法

1
echo .DS_Store >> ~/.gitignore

更优雅的做法

1.创建 ~/.gitignore_global 文件,把需要全局忽略的文件类型塞到这个文件里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# .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.在 ~/.gitconfig 中引入 .gitignore_global

1
2
3
4
5
6
7
8
9
[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

这样,以后就不用每次都在项目中的 .gitignore 文件中添加 .DS_Store了,类似“继承”。而每个项目中的 .gitignore 只需要根据情况引入一些针对项目要过滤的文件名就可以了。

后话

另外,在 macOS Sierra 10.12 上,已经隐藏这个 .DS_store 文件了,可能是苹果也发现它的恶心之处了吧,从用户体验的角度出发做了优化。但其实还是存在的,我开了虚拟机在 Windows 上就可以看到这个文件。所以即便在最新的系统下,仍然有必要对这个恶心的 .DS_store 做处理。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/9.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!