我有一个带有许多子文件夹的大型外部硬盘,我想将所有视频、图片和音乐移动到另一个硬盘上,最好的方法是什么?
答案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.