我知道我可以使用类似的方法 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 {} \;