假设我有文件 data_1.mat、data_2.mat、...、data_n.mat。如何在一行代码中将这些文件同步到另一个文件夹?
我知道的唯一方法是在 for 循环中执行此操作:
for i in 1..n
do
rsync 'data_$i' \dest\
done
如果我从服务器传输数据,这并不方便,因为它需要每次在 for 循环中建立一个新的 ssh。
答案1
您可以使用 shell 通配符来匹配相关文件集:
cp -p data_*.mat /dest/
如果您坚持的话可以使用rsync
,但根据您的描述,使用它可能是错误的工具:
rsync -a data_*.mat /dest/
在这两种情况下,shell(而不是命令)都会扩展data_*.mat
为所有匹配的文件/目录的列表,如果没有匹配,则保持不变。 (*
通配符匹配零个或多个字符;?
将精确匹配一个字符。)
如果您1..n
是可能匹配的子集,那就有点困难,但也不是很多。某些 shell(包括bash
)允许在固定范围内进行大括号扩展:{1..27}
例如。将其插入到模式中,您就有了另一个解决方案:
cp -p data_{1..27}.mat /dest/
请记住,当您使用通配符模式时,是 shell 扩展了它们,因此您没有理由不能将它们放入以echo
仅查看将要发生的情况的命令中:
echo data_?.mat
echo rsync -a data_*.mat /dest/
echo cp -p data_{1..27}.mat /dest/
答案2
您可以使用命令 lke this 提前生成所有必需文件的列表:
seq -f "data_%.0f.mat" 1 11
这将生成:
data_1.mat
data_2.mat
data_3.mat
...
data_11.mat
然后你可以使用
rsync –files-from=/path/of/file/with/above_list .....