代码之家  ›  专栏  ›  技术社区  ›  Christian Bongiorno

在路径中查找+cp空间,需要重命名。Howto?

  •  0
  • Christian Bongiorno  · 技术社区  · 6 年前

    我需要递归地查找所有名为“config.xml”的文件,并将它们放在一边进行分析。路径中有空间,只是为了保持有趣。但是,我需要它们是唯一的,否则它们将在同一个文件夹中发生碰撞。我想做的基本上是把它们复制下来,但是使用找到它们的目录名。我要的命令是类似的 this question 但我需要它来做一些像 $(dirname {}) . 当我这样做时,什么都不会移动(但我不会出错)

    示例,但非功能命令: find . -name 'config.xml' -exec sh -c 'cp "$1" "$2.xml"' -- {} "$HOME/data/$(dirname {})" \;

    3 回复  |  直到 6 年前
        1
  •  2
  •   Charles Duffy    6 年前

    要做到这一点,只需一个shell,而不是每个找到的文件一个shell(如前面的答案所用):

    while IFS= read -r -d '' filename; do 
      outFile="$HOME/data/${filename%/*}.xml"
      mkdir -p -- "${outFile%/*}"
      cp -- "$filename" "$outFile"
    done < <(find . -name 'config.xml' -print0)
    

    这样你 find 发出以nul分隔的文件名流,由 while read 在父shell中循环。

    (你 能够 使用 "$HOME/data/$(dirname "$filename").xml" 但从性能的角度来看,这真的很愚蠢: $() fork() 从一个潜艇上起飞,然后 dirname 是需要 exec 'd,链接并加载;当您只需对shell本身进行内部的字符串操作时,不需要考虑所有开销)。

        2
  •  2
  •   anubhava    6 年前

    您可以这样使用它:

    find . -name 'config.xml' -exec bash -c \
    'd="$HOME/data/${1%/*}/"; mkdir -p "$d"; command cp -p "$1" "$d"' - {} \;
    
        3
  •  1
  •   KamilCuk    6 年前

    -exec sh 有点难处理,但并非不可能。这个 $(dirname ...) 在运行sh之前展开,所以它等于 dirname {} -文件的目录名 {} . 做一些类似的事情 -exec sh -c ' .... ' -- {} 并把 $(dirname ... ) 在sh脚本中使用 $1 .

    find . -name 'config.xml' -exec sh -c 'cp "$1" "$2/data/$(dirname "$1").xml"' -- {} "$HOME" \;
    
    推荐文章