移动特定类型或扩展名的所有文件

移动特定类型或扩展名的所有文件

我有一个带有许多子文件夹的大型外部硬盘,我想将所有视频、图片和音乐移动到另一个硬盘上,最好的方法是什么?

答案1

我不是真的当然您想要从多个目录移动多个文件,但这是在一个目录结构中查找多个扩展名的文件的基本命令:

find /path/to/look/ -type f \( -iname \*.mp3 -o -iname \*.avi -o -iname \*.mp4 \)

显然,您还需要添加更多-o -iname ...内容,直到您确定找到了所需的所有文件。找到所有文件后,只需将以下内容添加到末尾:

-exec mv -t /path/to/destination {} +

这会将它们全部移动到指定目录中。


实现此目的的 Bashier 方法是使用一些通配符修饰符(globstar进行递归搜索(**nullglob返回有效文件并nocaseglob忽略大小写),然后mv在一个简单的for循环中将它们传递给:

shopt -s globstar nullglob nocaseglob
for f in /path/to/look/{**/,}*.{mp3,avi,mp4}; do
  mv "$f" /path/to/destination/
done

答案2

我会尝试类似的事情......

for files in $(find / | grep -P "([.]mp3$)|([.]avi$)")
do
cp $files /media/<your_external_drive>/target_folder/
done

如果您想一次性完成所有操作,则必须在正则表达式中添加要搜索的每个扩展。

或者如果你只是想移动目录,你可以使用,

cp -r /target/dir/on/machine /target/dir/on/external/drive

每个包含媒体文件的目录。

答案3

我强烈推荐这个项目免费文件同步。它不仅适合同步两个目录,还适合完成您心中的任务。您可以添加过滤器以包含或排除模式。首先,您只需浏览左侧的原点和右侧的目标。然后单击比较以搜索所有文件。最后单击顶部的红色漏斗以编辑过滤器。

对于过滤器,您将每个模式放在新行上。您可以将*包含部分中的替换为以下内容,并保持排除部分不变。以下内容将仅移动 mp3、avi 和 jpg 文件:

*.mp3
*.avi
*.jpg

或者,如果您将保留*在包含部分中,则可以指定您不想移动的文件。将以下内容添加到排除部分将移动除 txt、odt 和 pdf 文件之外的所有内容:

*.txt
*.odt
*.pdf

完成更改并关闭过滤器对话框后,不会移动的文件将变灰。底部“选择视图:”旁边的按钮允许您更改显示的文件(这些按钮不会影响要移动的文件)。通过仅选择灰色栏来仅显示“不执行任何操作”的文件,查找任何您想要移动但不会移动的文件,并相应地修改过滤器。同样,通过仅选择绿色箭头来仅显示要移动的文件,查找任何会移动但您不想移动的文件,并相应地修改过滤器。

答案4

你可以使用一个简单的 Python 脚本来完成这项工作:

#!/usr/bin/env python3

import os
import shutil

source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")

for root, dirs, files in os.walk(source_dir):
    for name in files:
        if name.endswith(extensions):
            file = root+"/"+name
            shutil.move(file, target_folder+"/"+name)

将上述代码粘贴到一个空的文本文件中,输入目标目录和源目录,输入要移动的文件扩展名,将其保存为move.py并通过以下命令运行:

python3 /path/to/move.py

为了避免覆盖可能的重复项(并重命名它们)

如果目录存在包含您想要保留的重复项(名称)的风险,则代码会更加广泛:

#!/usr/bin/env python3

import os
import shutil

source_dir = "/path/to/files"; target_folder = "/path/to/destination"; extensions = (".mp3", ".avi")

dup = 1
for root, dirs, files in os.walk(source_dir):
    for name in files:
        if name.endswith(extensions):
            file = root+"/"+name
            while os.path.exists(target_folder+"/"+name):
                name = name[:name.rfind(".")]+"_"+str(dup)+name[name.rfind("."):]
                dup = dup+1
            shutil.move(file, target_folder+"/"+name)

在这种情况下,多个场合file.mp3将被重命名为:

file.mp3
file_1.mp3
file_2.mp3
...etc.

相关内容