我有一个.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
逐行读取并将源目录和目标目录分配给变量src
和dest
。该行以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