如何将文本文件作为命令列表调用?批量迁移photo_rec恢复的JPG文件
如何将文本文件作为命令列表执行(批量迁移PhotoRec恢复的图片)
针对你要迁移245000+张PhotoRec恢复的JPG文件的需求,既然已经把命令整理成了newlist1.txt,下面给你几种直接调用这个命令列表的实用方法,操作都很简单:
方法1:直接用Shell解释器执行文件
这是最直接的方式,只要你的newlist1.txt里每行都是完整的可执行命令(比如mv /disks/Keep/new-s1-recov/recup_dir_01/*.jpg .这类),先切换到脚本所在目录:
cd /disks/Keep/new-s1-recov
然后用bash或者sh直接运行这个文本文件:
bash newlist1.txt # 或者用sh(如果是POSIX兼容的命令) sh newlist1.txt
这种方式会开启一个子shell执行所有命令,不会污染当前shell的环境变量,很安全。
方法2:在当前Shell中执行命令列表
如果你需要命令在当前shell环境下执行(比如依赖当前目录、环境变量等),可以用source命令或者它的简写.:
cd /disks/Keep/new-s1-recov # 两种写法效果一样 source newlist1.txt # 或者 . newlist1.txt
不过对于批量移动文件的场景,两种方法差别不大,选顺手的就行。
方法3:用xargs批量执行(适合命令格式特殊的情况)
如果你的命令列表是每行一个命令片段(比如只有目标路径),可以用xargs来拼接执行,但如果是完整命令的话,写法会稍微复杂一点:
xargs -I {} sh -c {} < newlist1.txt
不过这种方法不如前两种直接,一般推荐前两种。
重要注意事项
- 先测试命令正确性:在正式执行前,建议把
newlist1.txt里的mv改成echo mv,先运行一遍看看输出的命令是否符合预期,避免误移动文件。 - 处理命令行参数过长问题:因为你有24万+文件,如果命令里用
*.jpg通配所有文件,可能会触发"argument list too long"错误。如果遇到这种情况,建议把文件里的命令改成用find来批量处理,比如:
或者更高效的写法(减少进程创建次数):find recup_dir_* -type f -name "*.jpg" -exec mv {} . \;find recup_dir_* -type f -name "*.jpg" -exec mv {} . + - 后台执行并记录日志:因为文件数量极大,执行时间会很长,建议用
nohup后台运行,同时记录日志方便排查问题:
之后可以用nohup bash newlist1.txt > migrate_log.txt 2>&1 &tail -f migrate_log.txt查看实时进度。
内容的提问来源于stack exchange,提问作者Hal Hackney
相关产品推荐
相关产品推荐

