将所有相同扩展名的文件移动到文件夹中

将所有相同扩展名的文件移动到文件夹中

我知道我可以使用类似的方法 mv *zip zip/,但我想自动创建每个文件夹(如果不存在)并将我的所有文件移动到其中。使用以下代码,我必须对所有内容进行硬编码。有没有办法自动执行此操作。例如,首先获取文件的所有扩展名,然后创建文件夹(如果不存在)并根据文件类型将文件移动到其中,例如将 png 移动到 images/png、将 mp3 移动到 Audio/mp3 或将 pdf 移动到 Documents/pdf。

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

在此处输入图片描述

編輯-1 我已经想出了某种方法,但我不想移动 .sh 文件,如何从特定元素的数组中删除,并将 png、jpg 等文件类型分组为 images/png、images/jpg 和 mp3 到 Audio/mp3 或 pdf 到 Documents/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

答案1

根据文件类型移动文件
您可以批量创建目录,移动文件,然后删除空目录。

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 生成的文件列表进行修改,使用 while read 循环并对文件扩展名进行几次测试以移动到目录

for filename in *; do
  if [[ -f "$filename" ]]; then
    ext=${filename#$base.}
    mkdir -p "${ext}"
    mv "$filename" "${ext}"
  fi
done

答案2

使用它来组织你的文件谢谢韓國

#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 {} \;

相关内容