如何逐个将doc1目录文件移至doc2并在移动间执行其他命令?
实现逐个移动文件并执行后续命令的方案
没问题,我来给你准备几个实用的shell脚本方案,既能逐个移动文件,又能在每次移动后执行你需要的命令~
方案一:基础for循环(适合文件名无特殊字符的场景)
这种方法简单直观,非常适配你提到的cp01_01这类格式规整、无特殊字符的文件名:
#!/bin/bash # 定义源目录和目标目录,根据你的实际路径修改 src_dir="./doc1" dest_dir="./doc2" # 遍历doc1下所有符合cpXX_01格式的文件 for file in "$src_dir"/cp*_01; do # 先检查文件是否存在(防止没有匹配到文件时出现错误提示) [ -f "$file" ] || continue # 执行移动命令 mv "$file" "$dest_dir/" # -------------------------- # 这里写你每次移动后要运行的命令 # 示例1:打印移动完成的日志 echo "✅ 已完成移动: $(basename "$file")" # 示例2:调用其他脚本,把文件名作为参数传递过去 # ./your_custom_script.sh "$(basename "$file")" # -------------------------- done
使用步骤:
- 把上面的代码复制保存成
move_files.sh文件 - 给脚本添加执行权限:
chmod +x move_files.sh - 运行脚本:
./move_files.sh
方案二:find+while循环(更健壮,支持特殊文件名)
如果你的文件后续可能出现空格、换行这类特殊字符,这个方案会更稳妥,能处理所有合法的文件名:
#!/bin/bash src_dir="./doc1" dest_dir="./doc2" # 查找doc1下所有符合格式的文件,用null字符分隔避免特殊字符干扰 find "$src_dir" -maxdepth 1 -type f -name "cp*_01" -print0 | while IFS= read -r -d '' file; do # 移动文件,并且判断是否移动成功 if mv "$file" "$dest_dir/"; then echo "✅ 移动成功: $(basename "$file")" # -------------------------- # 这里添加移动成功后要执行的命令 # 示例:把移动记录写入系统日志 # logger -t file_mover "Moved $(basename "$file") to $dest_dir" # -------------------------- else echo "❌ 移动失败: $(basename "$file")" fi done
优势说明:
-maxdepth 1确保只处理doc1目录下的文件,不会递归子目录-print0和read -d ''配合,能完美处理包含空格、换行、特殊符号的文件名- 加入了移动成功的判断,只有当文件确实移动完成后才执行后续命令,避免无效操作
内容的提问来源于stack exchange,提问作者Cavad Pashayev
相关产品推荐
相关产品推荐

