我想将最后使用的(或可能创建的)总大小的文件复制到另一个文件夹。如果没有额外的工具,这可能吗?
我有一个特定大小的 USB 驱动器,小于文件夹的总大小。由于我无法将所有文件复制到 USB,因此我喜欢根据最新使用情况进行复制,直到没有更多空间为止。理想情况下,该方法还支持更新文件,而无需删除所有文件并重新复制它们。
答案1
假设(基于 [linux] 标签)您有bash
可用的以及 和stat
命令sort
;进一步假设您要首先同步最近修改的文件(请参阅人统计对于其他时间戳选项),那么这里是一个 bash 脚本,它将循环遍历当前目录中的所有文件(这for f in *
是关键行),将它们最后修改的时间戳收集到一个数组中,然后循环遍历排序的时间戳并印刷品——样品! -- 每个文件的 rsync 命令(当前附有时间戳调试信息作为证明)。
当然,您必须根据您的具体情况调整 rsync 命令。该脚本将为当前目录中的每个文件输出 rsync 命令;我的建议是要么“盲目”执行这些 rsync,让最后的失败,要么将它们放入脚本中单独执行。
该脚本不会尝试以任何方式优化目标的空间利用率 - 它所做的唯一排序是上次修改时间戳(以及关联数组的任意排序,以防同一秒内修改多个文件) 。
#!/usr/bin/env bash
declare -A times
# gather the files and their last-modified timestamp into an associative array,
# indexed by filename (unique)
for f in *
do
[ -f "$f" ] && times[$f]=$(stat -c %Y "$f")
done
# get the times in (unique) sorted order
for times in ${times[@]}
do
echo $times
done | sort -run | while read t
do
# then loop through the array looking for files with that modification time
for f in "${!times[@]}"
do
if [[ ${times[$f]} = $t ]]
then
echo rsync "$f" -- timestamp ${times[$f]}
fi
done
done
答案2
您应该按修改日期对文件进行排序,然后按该顺序将名称传递给rsync
复制。您也可以使用cp
它来代替,但rsync
效率更高。
superuser.com 上已经有一个关于如何执行此操作的线程:https://superuser.com/a/208749/554082