如何将所有扩展名的文件移动到子目录中?

如何将所有扩展名的文件移动到子目录中?

我有一个目录/media/home/Seagate Expansion Drive/Downloads/Java Spring Gurus/folder1 .../folder2 .../foldern

在每个目录中,我都有一个*.mp4文件和不同类型的附加文件(*.srt, *.pdf等)。我想将所有内容保留*.mp4在其中folderx,创建folderx/rest/并移动其他文件。

我怎么做?

我试过:

for files in $(find "/media/sergio/Seagate Expansion Drive/DOWNS/Spring Framework 5"  | grep -P "([.]srt$)|([.]pdf$)")
do
  mv $files /resto
done

但我有很多错误

mv:无法统计

答案1

我真的不明白使用find这里有什么用。您确切知道所有内容的位置,因此无需寻找文件。

相反,假设你正在使用bashshell,

#!/bin/bash

shopt -s extglob dotglob

for dirpath in '/media/home/Seagate Expansion Drive/Downloads/Java Spring Gurus'/folder*/
do
    mkdir -p "$dirpath"/rest &&
    mv -i "$dirpath"/!(*.mp4|rest) "$dirpath"/rest
done

这将循环遍历您的所有folder*目录。对于每个这样的目录,它会rest在其中创建一个子目录,然后将不匹配的所有内容*.mp4(或rest目录本身)移动到其中。

扩展的通配模式!(*.mp4|rest)将匹配任何不以.mp4, 和 not结尾的名称rest

shell 选项extglob允许在 中使用扩展的通配模式bash,并且dotglobshell 选项将允许 shell 通配符匹配隐藏名称。

答案2

该命令应该执行您期望的操作:

find "/media/sergio/Seagate Expansion Drive/DOWNS/Spring Framework 5" -type f \! -iname '*.mp4' -execdir mkdir -p rest \; -execdir mv "{}" rest/  \;

在此命令中:

  • -type f:仅匹配文件(避免移动目录、符号链接或特殊文件)

  • \!: 充当逻辑“NOT”

  • -iname:选择名称匹配的文件,不区分大小写(-name如果要匹配大小写则使用)

  • -execdir:从包含匹配文件的子目录运行命令。我们需要其中两个,一个用于创建文件夹rest/,第二个用于将文件移动到其中。

编辑:添加缺少的前导\;execdir仅使用并保留一种解决方案。

相关内容