Move all Files of same extension to a Folder

I know I can use something like mv *zip zip/ but I want to auto-create each folder if not exists and move my all files to them. With the below code I have to hard code everything. Is there any way to automate this. Like First Get all Extensions of files then Create folders if not exists and move files into them according to file types like png to images/png and mp3 to Audio/mp3 or pdf to Documents/pdf.

find . -name "*.mp4" -exec mv "{}" ./Videos \;

enter image description here

Edit-1 Я кое-как понял, но не хочу перемещать файлы .sh, как удалять из массива определенного элемента и группировать типы файлов, такие как png, jpg, для изображений / png, images / jpg и mp3 для аудио / mp3 или pdf для документов /pdf.

array=($(find . -type f | sed 's/.*\.//' | sort | uniq ))

for dir in "${array[@]}"; do
        [[ ! -d "$dir" ]] && mkdir "$dir"
        find . -name "*.$dir" -exec mv "{}" ./"$dir" \;
done
0
задан 26 July 2020 в 08:03

2 ответа

Перемещение файлов в зависимости от типа файла
Вы можете создавать свои каталоги в пакетном режиме, перемещать файлы, а затем удалять пустые каталоги.

ScriptRoot='/some/path'

# Create the Directories
mkdir '${ScriptRoot}/Images'
mkdir '${ScriptRoot}/Music'
mkdir '${ScriptRoot}/Documents'
mkdir '${ScriptRoot}/Videos'

# Move the files (edit to match the targeted extensions...
find '${ScriptRoot}' -name '*.mp3' -or -name '*.flac' -exec mv {} '${ScriptRoot}/Music' \;
find '${ScriptRoot}' -name '*.jpeg' -or -name '*.jpg' -or -name '*.png' -exec mv {} '${ScriptRoot}/Images' \;
# find (... and so and so for Documents and Videos)

# Delete empty directories
find '${ScriptRoot}' -depth -type d -empty -exec rmdir {} \;

Перемещение файлов на основе расширения файла намного проще, но это не то, что было задано.
Чтобы добиться того, что описано, это можно изменить с помощью списка файлов, созданного командой find, зацикленного на время чтения и нескольких тестов файла ext для перемещения в каталоги

for filename in *; do
  if [[ -f "$filename" ]]; then
    ext=${filename#$base.}
    mkdir -p "${ext}"
    mv "$filename" "${ext}"
  fi
done
2
ответ дан 30 July 2020 в 22:02

Используйте это для организации ваших файлов Благодаря cmak-fr

#images
declare -a array=("Images" "Images/png" "Images/jpg")

for dir in "${array[@]}"; do
    [[ ! -d "$dir" ]] && mkdir "$dir"
done

#Music Videos Executable & Fonts
declare -a array1=("Music" "Videos" "Executable" "Fonts")
for dir in "${array1[@]}"; do
    [[ ! -d "$dir" ]] && mkdir "$dir"
done

#Documents
declare -a array2=("Documents" "Documents/xlsx" "Documents/data" "Documents/docx" "Documents/pptx" "Documents/pdf" "Documents/txt" )
for dir in "${array2[@]}"; do
    [[ ! -d "$dir" ]] && mkdir "$dir"
done


#Compressed
declare -a array3=("Compressed" "Compressed/zip" "Compressed/targz")
for dir in "${array3[@]}"; do
    [[ ! -d "$dir" ]] && mkdir "$dir"
done

#Music
find . -maxdepth 1 -regex '\(.*mp3\|.*flac\)' -exec mv {} Music/  \;

#images
find . -maxdepth 1 -regex '\(.*jpeg\|.*jpg\|.*JPG\)'   -exec mv {} Images/jpg  \;
find . -maxdepth 1 -regex '\(.*png\|.*PNG\)'   -exec mv {} Images/jpg  \;
find . -maxdepth 1 -regex '\(.*ai\|.*bmp\|.*ico\|.*svg|.*tiff|.*psd\)' -exec mv {} Images/jpg  \;

#Videos
find . -maxdepth 1 -regex '\(.*mp4\|.*avi\|.*mkv\|.*mpeg|.*3gp|.*mpg\)' -exec mv {} Images/jpg  \;

#Documents
find . -maxdepth 1 -regex '\(.*ppt\|.*ppt\|.*pps\|.*odp\)'   -exec mv {} Documents/pptx  \;
find . -maxdepth 1 -regex '\(.*ods\|.*xls\|.*xlsx\|.*xlsm\)' -exec mv {} Documents/xlsx  \;
find . -maxdepth 1 -regex '\(.*doc\|.*docx\|.*rtf\|.*wpd\)'   -exec mv {} Documents/docx  \;
find . -maxdepth 1 -regex '\(.*pdf\|.*epub\)'   -exec mv {} Documents/pdf  \;
find . -maxdepth 1 -regex '\(.*csv\|.*db\|.*sql\|.*dat\)'   -exec mv {} Documents/data  \;
find . -maxdepth 1 -regex '\(.*txt\)'   -exec mv {} Documents/txt  \;

#Compressed
find . -maxdepth 1 -regex '\(.*zip\)'   -exec mv {} Compressed/zip  \;
find . -maxdepth 1 -regex '\(.*tar.gz\)'   -exec mv {} Compressed/targz  \;
find . -maxdepth 1 -regex '\(.*7z\)'   -exec mv {} Compressed  \;

# #Executable
find . -maxdepth 1 -regex '\(.*apk\|.*exe\|.*rpm\|.*msi\|.*pks\|.*jar\)' -exec mv {} Executable \;

# #Fonts
find . -maxdepth 1 -regex '\(.*ttf\|.*otf\|.*fon\|.*fnt\)'   -exec mv {} Fonts  \;

# Delete empty directories
find . -maxdepth 1 -depth -type d -empty -exec rmdir {} \;
1
ответ дан 30 July 2020 в 22:02

Другие вопросы по тегам:

Похожие вопросы: