Skip to content
Advertisement

how to move Files to a folder using mv in bash with condotions?

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.

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement