根据扩展名将文件移动到目录

May*_*hux 4 scripts

我有一个包含大量具有不同扩展名的文件的目录。我想要做的是将每个扩展名移动到一个名为扩展名的文件夹中,那些没有扩展名的文件移动到一个名为unkown.

例如我有文件a.txt, b.txt, a.pdf, b.pdf, a.mp4, file, newfile....

结果将是 4 个名为txt, pdf, mp4, 的目录unkonw

txt目录包含的文件a.txtb.txt

pdf目录包含的文件a.pdfb.pdf

mp4目录包含的文件a.mp4

unkonw目录包含的文件filenewfile

ter*_*don 6

这是另一种方式:

mkdir -p unknown; 
for f in *; do 
[[ $f =~ \. ]] && mkdir -p "${f##*.}" && 
               mv "$f" "${f##*.}"/ || 
mv "$f" unknown/; done
Run Code Online (Sandbox Code Playgroud)

解释

  • && 表示“仅当左侧的命令成功时才运行右侧的命令”。
  • ||表示“仅当左侧的命令失败时才运行右侧的命令”。组合的两个符号可以像if/else块一样工作。
  • mkdir -p unknown;: 创建unknown目录。在-p有使mkdir,如果该目录存在不会抱怨。
  • for f in * : 用于当前目录中的所有文件和目录。
  • [[ $f =~ \. ]] &&:如果当前文件/目录名称包含.,如果它有扩展名,则...
  • mkdir -p "${f##*.}"/:构造${var##pat}将从pat变量 的开头删除最长的匹配项$var。在这里, thepat是点的任何东西,所以这将只留下扩展名。因此,如果扩展目录不存在,此命令将创建该目录。
  • mv "$f" "${f##*.}"/:mv然后将文件移动到相关目录中。 || mv "$f" unknown/;: 如果上一个命令失败(如果此文件/目录)没有扩展名,请将其移至unknown.

请注意,这将打印此错误消息,但您可以放心地忽略它:

mv: cannot move ‘unknown’ to a subdirectory of itself, ‘unknown/unknown’
Run Code Online (Sandbox Code Playgroud)

如果您只需要移动文件而不移动目录(上面的命令也会移动一个名为dir.foointo的目录foo/),请改用:

mkdir -p unknown; 
for f in *; do 
[[ -f $f ]] && 
    if [[ $f =~ \. ]]; then 
        mkdir -p "${f##*.}" && 
        mv "$f" "${f##*.}"/; 
    else mv "$f" unknown/; fi; 
done
Run Code Online (Sandbox Code Playgroud)