在bash中重用通配符匹配

时间:2012-10-26 19:08:41

标签: bash wildcard

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

scp me@server:/data/stuff/*/needthis.txt ./?/needthis.txt
那是哪里的?在命令中将是*匹配的任何内容。

我的问题是有一堆目录,其中我想要复制一个在每个目录中具有相同名称的文件,我想保留它们来自的目录的名称,但我不仅仅想要复制整个“stuff”文件夹,因为这些目录中还有其他几百MB的文件,我不想浪费时间下载。

我可以轻松地做到这一点吗?

3 个答案:

答案 0 :(得分:1)

或许rsync可能就是您所需要的:

rsync -a --exclude='*' --include=needthis.txt me@server:/data/stuff/. .

答案 1 :(得分:1)

此解决方案非常复杂,并且由于多次调用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命令会阻止实际执行。而是显示命令本身。
  5. 现在,运行这个相当长的命令并检查输出。一旦您满意,删除两个echo并再次运行 - 这次执行将是真实的。我知道这个解决方案很长而且很笨拙,所以我很欣赏大师们的意见。

答案 2 :(得分:1)

如果目标文件全部存在于本地计算机上,您可以执行以下操作:

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