重复使用Bash中的通配符比赛



我想在bash中做这样的事情:

scp me@server:/data/stuff/*/needthis.txt ./?/needthis.txt

在哪里?在命令中, *与 *相匹配。

我的问题是有很多目录,我想复制一个在每个目录中的名称相同的文件,我想保留它们来自的目录的名称,但我不只是想复制整个"物品"文件夹,因为这些目录中还有其他文件是数百个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

解释

  1. 第一行:您远程登录到服务器,并找到所有感兴趣的文件。2>/dev/null短语丢弃了由SSH命令引起的额外输出。第一行的结果是文件名列表,包含完整路径,每行文件
  2. 第二行:while语句将这些文件读取到变量src
  3. 第三行:通过丢弃/data/stuff并用单个点(对于当前目录)构建目标文件。
  4. 第四行和第五行:在与源的本地计算机上创建一个目录结构,然后复制。但是,回声命令可防止实际执行。而是显示命令本身。

现在,运行此相当长的命令并检查输出。一旦满足,请删除两个echo并再次运行 - 这次执行将实现。我知道这个解决方案很长,很长,所以我感谢那里的大师的投入。

如果目标文件全部存在于本地计算机上,则可以:

for file in */needthis.txt; do
    scp me@server:/data/stuff/$file $file
done

相关内容

  • 没有找到相关文章

最新更新