按文件中的列表移动文件夹中的文件

按文件中的列表移动文件夹中的文件

我有一个.txt包含文件夹列表的文件:

old_folder_path1,new_folder_path1
old_folder_path2,new_folder_path2
old_folder_path3,new_folder_path3

我想运行一个 shell 命令,将每个文件夹系列的文件从旧文件夹移动到新文件夹。也不会覆盖和移动子文件夹,只是每个文件夹中的文件。

.txt我可以根据需要更改文件的语法以适应这一点。

答案1

使用rsync

while IFS=, read -r src dest; do
    [ ! -d "$src" ] && echo "skipping missing directory \"$src\"" >&2 && continue
    mkdir -p "$dest" && rsync -av --exclude='*/' --remove-source-files --ignore-existing "$src/" "$dest"
done < file.txt

该脚本file.txt逐行读取并将源目录和目标目录分配给变量srcdest。该行以IFS(内部字段分隔符)变量中定义的逗号分隔。如果src不是目录,则 while 循环继续下一行,否则如果目标目录不存在,则创建目标目录及其父目录。

rsync调用中使用以下选项(请参阅man rsync):

  • -a归档模式(选项的简写-rlptgoD
  • -v详细模式
  • --exclude='*/'排除目录,仅传输非目录
  • --remove-source-files传输完成后从发送端删除文件(如mv
  • --ignore-existing不要传输目标端已存在的文件

您可以将脚本保存为 shell 脚本mv_rsync.sh

#!/bin/sh

[ $# -ne 1 ] && echo "invalid file argument" >&2 && exit 1
while IFS=, read -r src dest; do
    [ ! -d "$src" ] && echo "skipping missing directory \"$src\"" >&2 && continue
    mkdir -p "$dest" && rsync -av --exclude='*/' --remove-source-files --ignore-existing "$src/" "$dest"
done < "$1"

使其可执行

chmod +x ./mv_rsync.sh

并将其运行为

./mv_rsync.sh file.txt

相关内容