I was writing this code to organize my downloads folder so it wouldn’t be messy. i want the files to be moved to their proper folder like for mp4 it should go to the Videos folder. but the code is not working
#! /bin/bash if [[ -d Videos/ ]] && [[ -d Compressed/ ]] && [[ -d Music/ ]] && [[ -d Pictures/ ]] && [[ -d Executables/ ]] && [[ -d Misc/ ]] then #Compressed Files if [[ -f *.7z ]] then mv *.7z Compressed/ fi if [[ -f *.rar ]] then mv *.rar Compressed/ fi if [[ -f *.zx ]] then mv *.xz Compressed/ fi if [[ -f *.zip ]] then mv *.zip Compressed/ fi if [[ -f *.gz ]] then mv *.gz Compressed/ fi if [[ -f *.iso ]] then mv *.iso Compressed/ fi #Videos if [[ -f *.mp4 ]] then mv *.mp4 Videos/ fi if [[ -f *.mov ]] then mv *.mov Videos/ fi if [[ -f *.wvm ]] then mv *.wvm Videos/ fi if [[ -f *.mkv ]] then mv *.mkv Videos/ fi #Musics if [[ -f *.mp3 ]] then mv *.mp3 Music/ fi if [[ -f *.wav ]] then mv *.wav Music/ fi if [[ -f *.ogg ]] then mv *.ogg Music/ fi #Pictures if [[ -f *.png ]] then mv *.png Pictures/ fi if [[ -f *.jpg ]] then mv *.jpg Pictures/ fi if [[ -f *.jpeg ]] then mv *.jpeg Pictures/ fi if [[ -f *.svg ]] then mv *.svg Pictures/ fi if [[ -f *.webp ]] then mv *.webp Pictures/ fi #documents if [[ -f *.doc ]] then mv *.doc Documents/ fi if [[ -f *.docx ]] then mv *.docx Documents/ fi if [[ -f *.pdf ]] then mv *.pdf Documents/ fi if [[ -f *.pptx ]] then mv *.pptx Documents/ fi if [[ -f *.ppt ]] then mv *.ppt Documents/ fi if [[ -f *.xls ]] then mv *.xls Documents/ fi if [[ -f *.xlsx ]] then mv *.xlsx Documents/ fi #Executables if [[ -x *.64 ]] then mv *.64 Executables/ fi if [[ -f *.deb ]] then mv *.deb Executables/ fi if [[ -f *.rpm ]] then mv *.rpm Executables/ fi #Misc FIles (Unknown file formats) else echo "No Directories found" sleep 1 echo "Creating Directories" mkdir Videos/ Compressed/ Music/ Pictures/ Executables/ Documents/ Misc/ sleep 1 echo "moving files" #Compressed Files if [[ -f *.7z ]] then mv *.7z Compressed/ fi if [[ -f *.rar ]] then mv *.rar Compressed/ fi if [[ -f *.zx ]] then mv *.xz Compressed/ fi if [[ -f *.zip ]] then mv *.zip Compressed/ fi if [[ -f *.gz ]] then mv *.gz Compressed/ fi if [[ -f *.iso ]] then mv *.iso Compressed/ fi #Videos if [[ -f *.mp4 ]] then mv *.mp4 Videos/ fi if [[ -f *.mov ]] then mv *.mov Videos/ fi if [[ -f *.wvm ]] then mv *.wvm Videos/ fi if [[ -f *.mkv ]] then mv *.mkv Videos/ fi #Musics if [[ -f *.mp3 ]] then mv *.mp3 Music/ fi if [[ -f *.wav ]] then mv *.wav Music/ fi if [[ -f *.ogg ]] then mv *.ogg Music/ fi #Pictures if [[ -f *.png ]] then mv *.png Pictures/ fi if [[ -f *.jpg ]] then mv *.jpg Pictures/ fi if [[ -f *.jpeg ]] then mv *.jpeg Pictures/ fi if [[ -f *.svg ]] then mv *.svg Pictures/ fi if [[ -f *.webp ]] then mv *.webp Pictures/ fi #documents if [[ -f *.doc ]] then mv *.doc Documents/ fi if [[ -f *.docx ]] then mv *.docx Documents/ fi if [[ -f *.pdf ]] then mv *.pdf Documents/ fi if [[ -f *.pptx ]] then mv *.pptx Documents/ fi if [[ -f *.ppt ]] then mv *.ppt Documents/ fi if [[ -f *.xls ]] then mv *.xls Documents/ fi if [[ -f *.xlsx ]] then mv *.xlsx Documents/ fi #Executables if [[ -x *.64 ]] then mv *.64 Executables/ fi if [[ -f *.deb ]] then mv *.deb Executables/ fi if [[ -f *.rpm ]] then mv *.rpm Executables/ fi #Mics FIles (Unknown file formats) fi
I guess it’s from ‘if’ statement but i don’t know how to fix it because i’m quite new to bash. the mkdir is working but all of the “if [[ -f *.mp4 ]]” was not.
Advertisement
Answer
Filename expansion is not performed within the bash compund command [[...]]
. So, for instance, *.7z
in [[ -f *.7z ]]
means literally a filename *.7z
. That’s why your script won’t work. The script below may be what you want:
#!/bin/bash mkdir -p Videos Compressed Music Pictures Documents Executables Misc || exit for f in ./*.{7z,rar,zx,zip,gz,iso}; do [[ -f $f ]] && mv "$f" Compressed done for f in ./*.{mp4,mov,wvm,mkv}; do [[ -f $f ]] && mv "$f" Videos done for f in ./*.{mp3,wav,ogg}; do [[ -f $f ]] && mv "$f" Music done for f in ./*.{png,jpg,jpeg,svg,webp}; do [[ -f $f ]] && mv "$f" Pictures done for f in ./*.{doc,docx,pdf,pptx,ppt,xls,xlsx}; do [[ -f $f ]] && mv "$f" Documents done
Notice the use of -p
option in mkdir
. The missing directories will be created and existing directories will be ignored without an error by this option.