我想在 bash 中做这样的事情:
scp me@server:/data/stuff/*/needthis.txt ./?/needthis.txt
那在哪里?在命令中将是任何与 *.
我的问题是有一堆目录,我想从中复制一个在每个目录中同名的文件,并且我想保留它们来自的目录的名称,但我不只是想复制整个“stuff”文件夹,因为这些目录中还有数百 MB 的其他文件,我不想浪费时间下载。
我可以轻松做到这一点吗?
也许rsync
是你需要的:
rsync -a --exclude='*' --include=needthis.txt me@server:/data/stuff/. .
这个解决方案非常笨拙,并且由于多次调用 scp 可能效率不高:
ssh me@server 'find /data/stuff -name needthis.txt' 2>/dev/null | \
while read src; do
dest=.${src#/data/stuff}
echo mkdir -p $(dirname $dest)
echo scp "me@server:$src" "$dest"
done
2>/dev/null
短语丢弃由 ssh 命令引起的额外输出。第一行的结果是文件名列表,包含完整路径,每行一个文件while
语句将这些文件中的每一个读入变量src
/data/stuff
并将其替换为单个点(对于当前目录)。现在,运行这个相当长的命令并检查输出。满意后,删除这两个echo
并再次运行——这次执行将真正发生。我知道这个解决方案很长而且很笨拙,所以我很感激大师们的投入。
如果目标文件都存在于本地计算机上,您可以执行以下操作:
for file in */needthis.txt; do
scp me@server:/data/stuff/$file $file
done