按扩展名将桌面组织到文件夹/目录的脚本

按扩展名将桌面组织到文件夹/目录的脚本

我想通过运行一个脚本来组织桌面,该脚本将所有文件按扩展名放入文件夹中。我通过谷歌搜索找到了一些代码,我找到的代码创建了一个带有文件名的文件夹,并将文件放置在该文件夹中。我不想要每个文件名一个文件夹...我希望一个文件夹包含所有 .txt,另一个文件夹包含 .jpg...等等。我使用 OS X。

这就是我所拥有的...任何方向都会很棒,谢谢!

for file in *.txt
    do
        dir="${file%.txt}"
        mkdir -- "$dir"
        mv -- "$file" "$dir"
done

答案1

如果您想要的是每个文件类型的目录,那么您想要的内容更像是:

mkdir txt || { echo "Can't mkdir txt" ; exit 1 ; }
for file in *.txt ; do
    mv -- "$file" txt/
done

请注意 上的故障处理mkdir。在您的代码中,如果已经有文件使用变量中包含的名称$dir,您的mkdir --"$dir"命令将默默失败,然后你的mv命令将覆盖那个文件。


要处理一堆任意命名的文件(当前目录中具有三字符扩展名的所有文件)并按文件扩展名将它们放入目录中,您可以使用以下代码(未经测试):

for file in *.??? ; do
    [ -f "$file" ] || continue
    dir="$(echo "$file" | rev | cut -c-3 | rev)"
    mkdir -p "$dir" || { echo "Couldn't mkdir -p $dir; exiting" ; exit 1 ; }
    mv -- "$file" "$dir"
done

解释:

该模式*.???将匹配所有文件和目录在当前目录中,其名称以句点 ( .) 结尾,后跟三个字符。

仅当是常规文件(不是目录或其他更专业的类型,如设备)时,测试[ -f "$file" ]才会返回 true。否则,该语句将跳过循环中的其余部分。$filecontinuefor

对变量的赋值dir看起来很花哨,但实际上它只是获取变量的内容$file,反转它,提取(反转字符串的)前 3 个字符,然后再次反转,并将结果指定为 的值$dir。换句话说,它是文件名的最后三个字符。

然后,mkdir -p如果目录已存在,则返回成功;如果不存在,则创建它(并返回成功)。如果它没有返回成功,您就不想尝试将文件移入其中!因此进行错误处理。

然后,mv命令就像平常一样。


关于错误处理的注意事项:

您可能会看到这样的结构:

mkdir -p "$dir" || echo "Failed, exiting" && exit 1

这是不完美的,因为exit只有在以下情况下才会执行该命令echo该命令成功命令失败后mkdir。相反,你想要的是拥有exit执行命令不管命令是否echo成功(假设mkdir失败)。这就是为什么我使用上面的花括号。

答案2

如果您想要的是每个文件类型的目录,那么您想要的内容更像是:

for file in *.*[!.]
do
    ext=${file##*.}
    mkdir -p -- "$ext"  &&  mv -- "$file" "$ext"/
done

与其他操作系统不同,在 Unix 中,*.*不是指所有文件,而是指其名称的所有文件包含至少一个.(点,又名句点),从而省略名称如txttodolist和 的文件oddball。 (为了混淆问题,shell 通配符排除了其名称的文件开始除非设置了  .该选项。)  (或者等效地,)进一步限制其名称的文件dotglob*.*[!.]*.*[^.]包含最后一个. 但没有.最后一个字符,从而省略名称类似于oddball.和 的文件odd.ball.。 AFAICT,这是名称具有非空扩展名的文件的一个很好的表征。

ext=${file##*.}通过删除直到并包括最后一个点的所有内容来提取该扩展名。如果上述分析正确,则该值应该为非空。如果参数已经存在(并且是目录),则该-p选项不会失败。mkdir如果您有名称类似于 、 和 的纯文件txtpdf以及jpg名称类似于shopping_list.txt (将产生ext=txt)的文件,或者在其他一些边缘情况下(例如,您在当前目录中没有写入权限,或者没有剩余空间)在文件系统中),mkdir 将要失败并会发出自己的诊断消息。并且,由于(如 @Wildcard 建议),将不会尝试&&以下操作。mv

命令末尾/mv是一个安全网,可防止破坏名称为txtpdf和的纯文件jpg

    mv -- "$file" "$ext"/

如果目标名称作为普通文件(或目录以外的任何文件类型)存在,则只会失败。

相关内容