我有一个文本文件,其中包含带有完整路径的文件列表,每一行代表每个文件。例如,文件的第一行是:
/mnt/data/data4/1998/reports/First Quarter.docx
所有文件共享相同的路径,直到“data4”部分(即/mnt/data/data4)。我想做的就是将每个文件移动到不同的驱动器。因此,例如,上述文件将被移动到
/mnt/data/data11/1998/reports/First Quarter.docx
路径的“data11”部分将保持不变,并替换所有文件的现有路径中的“data4”。文本文件和文件名中存在空格。在某些情况下,/data11 之后的目标路径部分已经存在,但在其他情况下则不会。
我想这可以使用单行完成sed
,xargs
但mv
似乎不太明白。任何建议将不胜感激。
答案1
使用rsync
:
synclist=$(mktemp)
sed 's,^/mnt/data/data4/,,' filelist.txt > "$synclist"
rsync -avh --files-from="$synclist" --remove-source-files /mnt/data/data4/ /mnt/data/data11/
rm "$synclist"
- 创建一个临时文件并将其分配给变量
synclist
。 /mnt/data/data4/
从所有行中删除前缀filelist.txt
并将输出保存在临时文件中。$synclist
将from中的文件(现在是相对路径)同步/mnt/data/data4/
到/mnt/data/data11/
。选项--remove-source-files
在传输后删除源文件(类似于mv
)。- 删除临时文件。