From 8a7d97f4be2583eafcdc0a48f8a8de4d5daf1897 Mon Sep 17 00:00:00 2001 From: Jun Wei Woon Date: Mon, 6 Jul 2020 12:33:48 +0800 Subject: [PATCH] Added archetypes, Added New Post --- archetypes/about.md | 6 + archetypes/archive.md | 7 + archetypes/author.md | 48 ++++++ archetypes/contact.md | 9 ++ archetypes/default.md | 20 +++ archetypes/gallery.md | 16 ++ archetypes/header.md | 88 +++++++++++ archetypes/presentation.md | 40 +++++ archetypes/publication.md | 18 +++ archetypes/resume.md | 36 +++++ archetypes/rich.md | 21 +++ archetypes/showcase.md | 18 +++ archetypes/talk.md | 13 ++ content/en/posts/directory_cleanup.md | 218 ++++++++++++++++++++++++++ static/images/postImages/Broom.png | Bin 0 -> 4153 bytes 15 files changed, 558 insertions(+) create mode 100644 archetypes/about.md create mode 100644 archetypes/archive.md create mode 100644 archetypes/author.md create mode 100644 archetypes/contact.md create mode 100644 archetypes/default.md create mode 100644 archetypes/gallery.md create mode 100644 archetypes/header.md create mode 100644 archetypes/presentation.md create mode 100644 archetypes/publication.md create mode 100644 archetypes/resume.md create mode 100644 archetypes/rich.md create mode 100644 archetypes/showcase.md create mode 100644 archetypes/talk.md create mode 100644 content/en/posts/directory_cleanup.md create mode 100644 static/images/postImages/Broom.png diff --git a/archetypes/about.md b/archetypes/about.md new file mode 100644 index 0000000..c5c5220 --- /dev/null +++ b/archetypes/about.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +type: about +--- diff --git a/archetypes/archive.md b/archetypes/archive.md new file mode 100644 index 0000000..bbc58cf --- /dev/null +++ b/archetypes/archive.md @@ -0,0 +1,7 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +type: archive +description: +titleWrap: wrap # wrap, noWrap +--- diff --git a/archetypes/author.md b/archetypes/author.md new file mode 100644 index 0000000..82671fc --- /dev/null +++ b/archetypes/author.md @@ -0,0 +1,48 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +tags: +- +series: +- +categories: +- +author: +authorEmoji: 🤖 +authorImage: "/images/whoami/avatar.jpg" +authorImageUrl: "" +authorDesc: +socialOptions: + email: "" + phone: "" + facebook: "" + twitter: "" + github: "" + stack-overflow: "" + instagram: "" + google-plus: "" + youtube: "" + medium: "" + tumblr: "" + linkedin: "" + pinterest: "" + stack-exchange: "" + telegram: "" + steam: "" + weibo: "" + douban: "" + csdn: "" + gitlab: "" + mastodon: "" + jianshu: "" + zhihu: "" + signal: "" + whatsapp: "" + matrix: "" + xmpp: "" + dev-to: "" + gitea: "" + google-scholar: "" + twitch: "" +--- diff --git a/archetypes/contact.md b/archetypes/contact.md new file mode 100644 index 0000000..f4b25f8 --- /dev/null +++ b/archetypes/contact.md @@ -0,0 +1,9 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +type: contact +service: formspree # formspree, getform +formId: "" +getformToken: "" +--- diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..ef85f04 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,20 @@ +--- +author: "Devoalda" +authorEmoji: 🐺 +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +draft: false +hideToc: false +enableToc: true +enableTocContent: true +tocPosition: inner +tocLevels: ["h2", "h3", "h4"] +tags: +- +series: +- +categories: +- +image: +--- diff --git a/archetypes/gallery.md b/archetypes/gallery.md new file mode 100644 index 0000000..c2bb142 --- /dev/null +++ b/archetypes/gallery.md @@ -0,0 +1,16 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +type: gallery +mode: at-once # at-once or one-by-one +tags: +- +series: +- +categories: +- +images: # when mode is one-by-one, images front matter works + - image: + caption: +--- diff --git a/archetypes/header.md b/archetypes/header.md new file mode 100644 index 0000000..6d7567d --- /dev/null +++ b/archetypes/header.md @@ -0,0 +1,88 @@ +--- +header: + - type: text + height: 235 + paddingX: 50 + paddingY: 0 + align: left + title: + - header title1 + - header title2 + subtitle: + - header subtitle1 + - header subtitle2 + titleColor: + titleShadow: false + titleFontSize: 44 + subtitleColor: + subtitleCursive: false + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - type: img + image: images/header/background.png + height: 235 + paddingX: 50 + paddingY: 0 + align: center + title: + - header title1 + - header title2 + subtitle: + - header subtitle1 + - header subtitle2 + titleColor: + titleShadow: false + titleFontSize: 44 + subtitleColor: + subtitleCursive: false + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - type: slide + height: 235 + options: + startSlide: 0 + auto: 5000 + draggable: true + autoRestart: true + continuous: true + disableScroll: true + stopPropagation: true + slide: + - paddingX: 50 + paddingY: 0 + align: left + image: images/header/background.png + title: + - header title1 + subtitle: + - header subtitle1 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - paddingX: 50 + paddingY: 0 + align: center + image: images/header/background.png + title: + - header title2 + subtitle: + - header subtitle2 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - paddingX: 50 + paddingY: 0 + align: right + image: images/header/background.png + title: + - header title3 + subtitle: + - header subtitle3 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 +--- \ No newline at end of file diff --git a/archetypes/presentation.md b/archetypes/presentation.md new file mode 100644 index 0000000..e20aa05 --- /dev/null +++ b/archetypes/presentation.md @@ -0,0 +1,40 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +type: presentation +tags: +- +series: +- +categories: +- +plugins: +- highlight +- zoom +- notes +- math +highlightTheme: monokai # monokai, zenburn +revealTheme: beige # beige, black, blood, league, monokai, moon, night, serif, simple, sky, solarized, white +revealBackgroundColor: "" # #fff or rgba() or hsl() +revealBackgroundImage: "" # /images/myImage.png <= static folder path +revealBackgroundPosition: "" # left top, left center, left bottom, right top, right center ... +revealBackgroundRepeat: "" # repeat, repeat-x, repeat-y, no-repeat, inherit +revealBackgroundOpacity: "" # 0~1 +revealBackgroundVideo: "" # /videos/myVideo.mp4 <= static folder path, A single video source, or a comma separated list of video sources. +revealBackgroundVideoLoop: false # true, false +revealBackgroundVideoMuted: false # true, false +revealBackgroundSize: "" # cover, contain, ... +reveal: + - main: + - sub: + - | + + - sub: + - | + + - main: + - sub: + - | + +--- diff --git a/archetypes/publication.md b/archetypes/publication.md new file mode 100644 index 0000000..93d9d8b --- /dev/null +++ b/archetypes/publication.md @@ -0,0 +1,18 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +shorttitle: +date: {{ .Date }} +description: +type: publication +authors: [] +publication: +abstract: +links: + - name: + link: +ENTRYTYPE: "misc" +enableToc: false +enableWhoami: true +pinned: false +publishDate: {{ dateFormat "2006-01-02" .Date }} +--- diff --git a/archetypes/resume.md b/archetypes/resume.md new file mode 100644 index 0000000..df67503 --- /dev/null +++ b/archetypes/resume.md @@ -0,0 +1,36 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +type: resume +enableToc: false +header: + image: + src: + height: + alt: + infos: + name: + email: + phone: + website: + addr: +items: + - title: + sections: + - title: + subtitle: + startDate: + endDateText: + endDate: + contents: | + + - title: + sections: + - title: + subtitle: + startDate: + endDateText: + endDate: + contents: | +--- \ No newline at end of file diff --git a/archetypes/rich.md b/archetypes/rich.md new file mode 100644 index 0000000..8e6b4d1 --- /dev/null +++ b/archetypes/rich.md @@ -0,0 +1,21 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +tags: +- +series: +- +categories: +- +libraries: +- katex +- mathjax +- chart +- flowchartjs +- msc +- katex +- mermaid +- viz +- wavedrom +--- diff --git a/archetypes/showcase.md b/archetypes/showcase.md new file mode 100644 index 0000000..939bb24 --- /dev/null +++ b/archetypes/showcase.md @@ -0,0 +1,18 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: +link: +repo: +pinned: true +thumb: +weight: +links: +- name: + icon: + link: +shields: +- name: + image: + link: +--- \ No newline at end of file diff --git a/archetypes/talk.md b/archetypes/talk.md new file mode 100644 index 0000000..ca638e6 --- /dev/null +++ b/archetypes/talk.md @@ -0,0 +1,13 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +publishDate: {{ .Date }} +description: +tags: +- +series: +- +categories: +- +titleWrap: wrap # wrap, noWrap +--- \ No newline at end of file diff --git a/content/en/posts/directory_cleanup.md b/content/en/posts/directory_cleanup.md new file mode 100644 index 0000000..b6b670f --- /dev/null +++ b/content/en/posts/directory_cleanup.md @@ -0,0 +1,218 @@ +--- +author: "Devoalda" +authorEmoji: 🐺 +title: "Directory Cleanup" +date: 2020-07-06T11:07:16+08:00 +description: Directory Cleanup with python +draft: false +hideToc: false +enableToc: true +enableTocContent: true +tocPosition: inner +tocLevels: ["h2", "h3", "h4"] +tags: +- python +- automation +- script +series: +- Python +categories: +- python +- script +image: images/postImages/Broom.png +--- + +## Introduction +This is a script to automate cleanups in any directory. It will move files into folders according to the file extension. + +### Why? +A clean home/project directory allows us to be able to work productively, without spending much time searching for the particular document/file we need. + +This is a simple script to help you clean your directory in seconds + +### Caution +__DO NOT__ run the script on any directory containing system/important files. + +## Dependencies +* [Python3.8](https://www.python.org/) + +## Code + +### Imports +This is a python script, we will be using modules [os](https://docs.python.org/3/library/shutil.html) and [shutil](https://docs.python.org/3/library/shutil.html). First of all, create a new script called script.py, and import the modules required for this +```python +#!/usr/bin/env python + +import os +import shutil +``` +Notice the first line ___#!/usr/bin/env python___. This is called a [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)). It allows us to run the script as an executable, with the command +```bash +./script.py +``` +Without the shebang, we will need to use the full command +```bash +python3 script.py +``` +### Defining Main +This step is __optional__, although it will make the code look cleaner +```python +def main(): + print('Hello, World!') + +if __name__ == "__main__": + main() +``` +This is how I usually start my code, you will be able to run your code now with the command +```bash +./script.py +# Output: Hello,World! +``` + +### Defining a dictionary +A dictionary has a key, value pair, similar to a JSON file structure. In this script, we will create a dictionary of File type(Key) and File Extensions (Value). + +Insert the following ___above___ the line ```def main():``` +```python +DIRECTORIES_DICTIONARY = { + 'Document': ['.doc','.docx','.pdf','.log','.txt','.rtf','.asp','.aspx','.csv','.html','.css','.js','.xml','.xls'], + 'Folder': [], + 'Audio' : ['.aif','.m3u','mp3','flac','.mpa','.wav','.m4a'], + 'Video' : ['.mp4','.flv','.mov','.vob'], + 'Image' : ['.jpg','.jpeg','.png'], + 'Zip' : ['.zip', '.7z', '.tar.gz', '.deb', '.rpm'], + 'Executables': ['.apk','.exe','.jar'], + 'Others': [] + } +``` +You are able to expand this dictionary by adding your own file types and file extensions in a similar structure. + +### Creating folders based on directory key +In ```def main():```, add the following lines +```python +DIRECTORIES= [] + +for dir in DIRECTORIES_DICTIONARY: + if not os.path.isdir(dir): + print("Creating Directory '{}'".format(dir)) + os.mkdir(dir) + DIRECTORIES.append(dir) +``` +_Note_ the indentation of the lines! + +When you run the script, you will see new folders being created in your directory +### Moving file to correct directories +Append the following lines to your main function +```python +file_moved_counter = 0 +file_list = os.listdir('.') + +for file in file_list: + if 'directory_cleanup' not in file and file not in DIRECTORIES: + # Check if file is a folder first + if os.path.isdir(file): + shutil.move(file, './Folder/{}'.format(file)) + file_moved_counter += 1 + else: + print('Current File: ' + file + '\n') + filename, file_extension = os.path.splitext(file) + for dir in DIRECTORIES_DICTIONARY: + if file_extension in DIRECTORIES_DICTIONARY[dir]: + os.rename(file, './'+dir+'/'+ file) + print('MOVED FILE: ' + file + '\n') + file_moved_counter += 1 + +#Moving files with unknown file extensions to Others folder +new_file_list = os.listdir('.') +for file in new_file_list: + if 'directory_cleanup' not in file and file not in DIRECTORIES: + os.rename(file, './Others/'+ file) + file_moved_counter += 1 + +print('Files Organized!\nTotal file moved: ' + str(file_moved_counter)) +``` +These lines will move files to their folder based on their file extensions, and move undefined extensions to the 'Others' directory. + +In this script, I've used both modules os and shutil to move files to show the difference in syntax for each of the modules. + +### Running the script +```bash +./script.py +``` +To test the script, you should add/create files with any extensions in the same directory as your script. Upon running the script, you should see all your files moved and categorized according to their file extensions. + +## Tips +* I usually create a project folder for any scripts that I create, and run the script in the folder. This prevents any unwanted modifications to any directory. +* Note that indentations in a python script is very __important__. +* This script is useful in certain directories, like Documents or Downloads, as it categorizes those files accordingly and cleans the directory. +## Summary +Thats it! You have yourself a cleanup script that you can use to clean any directory you want! The full code is below, do take a look if you are facing any problems! + +### Full Code +{{< expand "Python Code" >}} +``` python +#!/usr/bin/env python + +#Done By: Devoalda +#Downloads Directory Cleanup + +import os +import shutil + +DIRECTORIES_DICTIONARY = { + 'Document': ['.doc','.docx','.pdf','.log','.txt','.rtf','.asp','.aspx','.csv','.html','.css','.js','.xml','.xls'], + 'Folder': [], + 'Audio' : ['.aif','.m3u','mp3','flac','.mpa','.wav','.m4a'], + 'Video' : ['.mp4','.flv','.mov','.vob'], + 'Image' : ['.jpg','.jpeg','.png'], + 'Zip' : ['.zip', '.7z', '.tar.gz', '.deb', '.rpm'], + 'Executables': ['.apk','.exe','.jar'], + 'Others': [] + } + +def main(): + file_moved_counter = 0 + file_list = os.listdir('.') + DIRECTORIES= [] + + for dir in DIRECTORIES_DICTIONARY: + if not os.path.isdir(dir): + print("Creating Directory '{}'".format(dir)) + os.mkdir(dir) + DIRECTORIES.append(dir) + + for file in file_list: + if 'directory_cleanup' not in file and file not in DIRECTORIES: + # Check if file is a folder first + if os.path.isdir(file): + shutil.move(file, './Folder/{}'.format(file)) + file_moved_counter += 1 + else: + print('Current File: ' + file + '\n') + filename, file_extension = os.path.splitext(file) + for dir in DIRECTORIES_DICTIONARY: + if file_extension in DIRECTORIES_DICTIONARY[dir]: + os.rename(file, './'+dir+'/'+ file) + print('MOVED FILE: ' + file + '\n') + file_moved_counter += 1 + + #Moving files with unknown file extensions to Others folder + new_file_list = os.listdir('.') + for file in new_file_list: + if 'directory_cleanup' not in file and file not in DIRECTORIES: + os.rename(file, './Others/'+ file) + file_moved_counter += 1 + + print('Files Organized!\nTotal file moved: ' + str(file_moved_counter)) + +if __name__ == "__main__": + main() +``` +{{< /expand >}} + +## Credits + +{{< expand "Credits" >}} +Broom icon icon by Icons8 +{{< /expand >}} + diff --git a/static/images/postImages/Broom.png b/static/images/postImages/Broom.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ac53c093338bf0ce91469250cfe35076a03259 GIT binary patch literal 4153 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 z