![如何将所有扩展名的文件移动到子目录中?](https://linux22.com/image/161295/%E5%A6%82%E4%BD%95%E5%B0%86%E6%89%80%E6%9C%89%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%EF%BC%9F.png)
我有一个目录/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
这里有什么用。您确切知道所有内容的位置,因此无需寻找文件。
相反,假设你正在使用bash
shell,
#!/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
,并且dotglob
shell 选项将允许 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
仅使用并保留一种解决方案。