我有一个目录/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
仅使用并保留一种解决方案。