用于将目录(和子目录)中的所有文件移动到基​​于扩展名的新文件夹的脚本

用于将目录(和子目录)中的所有文件移动到基​​于扩展名的新文件夹的脚本

我必须使用 photorec 恢复 micro-sd 卡。我留下一个目录,其中包含许多其他目录,其中还包括多个文件扩展名。我想根据文件扩展名将每个文件移动到新目录:

*.jpg 移动到目录 /SortedDir/jpg

*.gif 移至目录 /SortedDir/gif

还需要考虑没有扩展名或 *.<'blank> 的原始文件

我已经在 Windows 上批量成功完成了此操作:

@Echo OFF

Set "Folder=C:\MessyDir"
Set "DestDir=C:\SortedDir"

FOR /R "%Folder%" %%# in ("*") DO (
    If not exist "%DestDir%\%%~x#" (MKDIR "%DestDir%\%%~x#")
    Echo [+] Moving: "%%~nx#"
    Move "%%#" "%DestDir%\%%~x#\" 1>NUL
)

Pause&Exit

正在寻找linux脚本版本。

谢谢!!

答案1

假设所有未排序的文件都位于messy_dir并且您的子目录位于 中sorted_dir,您可以执行以下操作:

(cd sorted_dir; mkdir jpg gif)
find messy_dir -type f \( -iname '*.jpg' -exec mv {} ../sorted_dir/jpg/ \; -o \
                          -iname '*.gif' -exec mv {} ../sorted_dir/gif/ \; \)

这可以改进,但这是一个不错的起点。


如果您想要一个脚本,请尝试以下操作:

#!/bin/bash

# Check assumptions
[ "$#" -eq 2 ] || exit 1
[ -d "$1" ] || exit 1

find "$1" -type f -name '*?.?*' -exec sh -c '
    mkdir -p "$2/${1##*.}" && mv "$1" "$2/${1##*.}"
' find-sh {} "$2" \;

答案2

使用您的一些参数:

#!/bin/bash

# collect directory names
MessyDir="$1"
SortedDir="$2"

# test if user supplied two arguments
if [ -z $2 ]; then
    echo "Error: command missing output directory" 
    echo "Usage: $0 input_dir output_dir" 
    exit 1
fi

# read recursively through MessyDir for files 
find $MessyDir -type f | while read fname; do

    # form out_dir name from user supplied name and file extension
    out_dir="$SortedDir/${fname##*.}"

    # test if out_dir exists, if not, then create it
    if [ ! -d "$out_dir" ]; then
        mkdir -p "$out_dir"
    fi

    # move file to out_dir
    mv -v "$fname" "$SortedDir/${fname##*.}"

done

这比必要的更耗时,并且需要 Bash 4 或更高版本,因为变量扩展 ${fname##*.} 这避免了对 basename 的调用,并且可以与 photorec 一起正常工作。此外,该脚本适用于 photorec 导出的所有文件类型,而不仅仅是 jpg 和 gif。

相关内容