netpi / netpi.github.io

陈东泽(Eurychen)个人博客系统
https://eurychen.me
0 stars 0 forks source link

"多多益善"的MacOS文件管理方案 #3

Open netpi opened 4 years ago

netpi commented 4 years ago

https://eurychen.me/post/solutions-of-macos-file-management/

on7line commented 2 years ago

您好,Hazel规则第一个执行的shell脚本内容是什么能发一下吗?我这无法导入规则,看不到此项内容

netpi commented 2 years ago

@on7line 您好,Hazel规则第一个执行的shell脚本内容是什么能发一下吗?我这无法导入规则,看不到此项内容

_root 可替换成存储的根目录

_root=~/Library/Mobile\ Documents/com\~apple\~CloudDocs/Marked_iCloud/
_sortIntoSubfolderByKind=1

smartMv(){
# Variable definitions start
file=$1 # file path
_root=$2 # root directory
sortByKind=$3 # if needed sort by kind in Folders
fileName=$(basename -- "$file")
# Variable definitions ended

# function defined
moveTO(){
  if `[ -d $2 ]` # if folder exist
    then mv $1 $2/${3}
  else
    mkdir -p $2
    mv $1 $2/${3}
  fi
}
mdlsFormat(){ # format result for `mdls`
  echo `mdls -name $1 $2 | cut -d "=" -f 2 | sed 's/\"//g' | sed -e 's/^[[:space:]]*//'`
}
mdlsFormatUTI(){
  echo `mdls -name $1 $2 | cut -d "=" -f 2 | sed 's/,//' | sed 's/)//' | sed 's/(//'`
}
# function defined ended

# Classification according to utiTree start
utiTree=(`mdlsFormatUTI kMDItemContentTypeTree $file`)
for uti in $utiTree
do
  _uti=`echo $uti | sed 's/\"//g'`

  case $_uti in
    public.source-code)
    _basePath=${_root}Source-code/
    break
    ;;
    public.composite-content)
    _basePath=${_root}Documents/
    break
    ;;
    public.presentation)
    _basePath=${_root}Presentations/
    break
    ;;
    public.disk-image)
    _basePath=${_root}Disk-images/
    break
    ;;
    public.archive)  
    _basePath=${_root}Archives/
    break
    ;;
    public.movie)  
      _basePath=${_root}Videos/
      break
    ;;
    public.audio)  
      _basePath=${_root}Audios/
      break
    ;;
    public.image)  
      _basePath=${_root}Pictures/

      break
    ;;
    public.plain-text) 
     _basePath=${_root}Documents/
     break
    ;;
    public.folder) 
    _basePath=${_root}Folders/
    break
    ;;
    *)
    echo other $_uti
    _basePath=${_root}Others/
    ;;
  esac
done
# Classification according to utiTree ended

# fix basePath by extension
extension="${fileName##*.}"
echo extension $extension
case $extension in
  docx|xlsx)
    _basePath=${_root}Documents/
    ;;
  pptx|ppt|key)
    _basePath=${_root}Presentations/
    ;;
  archiver|7z|rar|gz)
    _basePath=${_root}Archives/
    ;;
esac

# rename start

kMDItemContentCreationDate=`mdlsFormat kMDItemContentCreationDate $file`

regexp="(^[0-9]{4}\-[0-9]{2}\-)" # check file name
if [[ $fileName =~ $regexp ]]
  then
  else
    creationDatesFormat=`date -j -f " %Y-%m-%d %H:%M:%S %z" "$kMDItemContentCreationDate" +%Y-%m-`
    fileName=${creationDatesFormat}$fileName # rename file by adding creationTime
fi
# rename end

# mv to folder start
if [[ $sortByKind == 1 ]] 
then
  kind=`mdlsFormat kMDItemKind $file`
  destination=${_basePath}${kind}
  moveTO $file ${destination} ${fileName} # sort to finder by kind
else 
  moveTO $file $_basePath ${fileName} # move to basePath
fi
# mv to folder end

}
smartMv $1 $_root $_sortIntoSubfolderByKind
on7line commented 2 years ago

谢谢!

on7line commented 2 years ago

请教 mark、subfolder这两个规则是怎么配置的呢?

netpi commented 2 years ago

@on7line 请教 mark、subfolder这两个规则是怎么配置的呢?

mark

脚本内容如下:

file=$1

mdlsFormat(){ # format result for `mdls`
  echo `mdls -name $1 $2 | cut -d "=" -f 2 | sed 's/\"//g' | sed -e 's/^[[:space:]]*//'`
}

fileName=`mdlsFormat kMDItemFSName $file`
kMDItemContentCreationDate=`mdlsFormat kMDItemContentCreationDate $file`

regexp="(^[0-9]{4}\-[0-9]{2}\-)" # check file name
if [[ $fileName =~ $regexp ]]
  then
  else
    creationDatesFormat=`date -j -f " %Y-%m-%d %H:%M:%S %z" "$kMDItemContentCreationDate" +%Y-%m-`
    fileName=${creationDatesFormat}$fileName
    mv $file `dirname $file`/$fileName
fi

subfolder

on7line commented 2 years ago

感谢,我去试试

unix2dos commented 2 years ago

shell 脚本里用的mv,会导致同名文件会覆盖。(自动命名后的,同日期同文件名)。

hazel 里的mv其实是有很多选项的。

image
netpi commented 2 years ago

@unix2dos shell 脚本里用的mv,会导致同名文件会覆盖。(自动命名后的,同日期同文件名)。

hazel 里的mv其实是有很多选项的。

image

是的,不过和脚本结合起来使用比较麻烦,还是写到一个shell脚本里比较方便维护。之前考虑因为加了时间前缀重名的概率很低,所以就偷懒没增加判断重名的逻辑 😄。

on7line commented 2 years ago

这个方案特别好用,我现在使用keyboard Maestro增加了两个快捷键,一步增加localremote tag,这样就不用选了。

image
Evankoo commented 1 year ago

大佬我问下这个脚本可以用于外接硬盘吗,还是只能用于云盘,如果可以用外接硬盘的话,这个路径怎么配置呢

netpi commented 1 year ago

大佬我问下这个脚本可以用于外接硬盘吗,还是只能用于云盘,如果可以用外接硬盘的话,这个路径怎么配置呢

可以呀,把 _root 换成你硬盘的路径就可以了

_root=~/Library/Mobile\ Documents/com\~apple\~CloudDocs/Marked_iCloud/
Evankoo commented 1 year ago

@netpi

大佬我问下这个脚本可以用于外接硬盘吗,还是只能用于云盘,如果可以用外接硬盘的话,这个路径怎么配置呢

可以呀,把 _root 换成你硬盘的路径就可以了

_root=~/Library/Mobile\ Documents/com\~apple\~CloudDocs/Marked_iCloud/

因为我比较小白,还不是很清楚 我的硬盘名字叫SSD,文件路径应该是Volumes/SSD/Marked_SSD 那在这里 是:_Volumes=~/SSD/Marked_SSD/ 还是:_SSD=~/Marked_SSD/ 我有点晕😵‍💫

netpi commented 1 year ago

@Evankoo ~在mac里是用户目录,如果你mac的用户名是 Evankoo 那么~就代表 /Users/Evankoo 如果你的硬盘绝对路径是 /Volumes/SSD/Marked_SSD 那么_root=/Volumes/SSD/Marked_SSD

Evankoo commented 1 year ago

@netpi @Evankoo ~在mac里是用户目录,如果你mac的用户名是 Evankoo 那么~就代表 /Users/Evankoo 如果你的硬盘绝对路径是 /Volumes/SSD/Marked_SSD 那么_root=/Volumes/SSD/Marked_SSD

搞定了,好像硬盘名称不能有空格。 感谢大佬,这套文件管理流程太牛了,打算好好实际运用