【问题标题】:Duplicate files with similar file names in UNIX在 UNIX 中具有相似文件名的重复文件
【发布时间】:2010-11-07 21:35:32
【问题描述】:

我在一个名为的目录中有一组文件:

OneThing-x.extension
OneThing-y.extension
OneThing-z.extension

我使用什么 UNIX 命令(find、cp、xargs、sed?)将它们复制到

AnotherThing-x.extension
AnotherThing-y.extension
AnotherThing-z.extension

使得 x ->copy-> x 和 y ->copy -> y

我有 find .. 开始的命令的一部分,它选择文件,但我卡在那里。

编辑 显然,我想保留原件和副本,所以重命名对我来说并不能解决问题。

【问题讨论】:

    标签: unix sed


    【解决方案1】:

    你也可以使用 mmv:

    $ mmv -c "OneThing*" "AnotherThing#1"
    

    $ mmv -c "OneThing-*.extension" "AnotherThing-#1.extension"
    

    【讨论】:

    • 如果您使用的是基于 debian 的发行版,"apt-get install mmv" 将解决这个问题。我确信 RPM 基础发行版提供了类似的软件包。
    【解决方案2】:

    怎么样:

    $ touch a1.a a2.a a3.a
    $ ls
    
    a1.a  a2.a  a3.a
    
    $ for a in a*.a ; do cp $a $(echo $a | sed 's/^a/b/') ; done
    $ ls
    
    a1.a  a2.a  a3.a  b1.a  b2.a  b3.a
    

    【讨论】:

    • 提供的最短、最优雅的解决方案。而且,它就像一个魅力!
    • 我的工具箱里有一个常规的cantrip(虽然我已经大到可以默认使用反引号)。有时用 find 来获取输入列表。需要注意的是替换正则表达式的唯一性。最安全的是第一次使用 echo 而不是 cp 运行它。
    • 引用您的 shell 变量,以防您曾经将此类脚本与包含空格的文件名(或目录名)一起使用。 (我们不会讨论以“-”开头的文件名,因为它们只是邪恶的。)
    • 真正的 Unix 用户不会创建带有空格或大写字母 (!) 的文件名。但是,是的,如果这是一种风险,那么应该引用变量。而且,正如 dmckee 所建议的,首先运行 echo 是一个非常好的主意。我就是这样做的。
    【解决方案3】:

    我的粗略解决方案是这样的:

    for FIL in OneThing*; do NFIL=`echo $FIL|sed 's/OneThing/AnotherThing/'`; cp "$FIL" "$NFIL"; done;
    

    【讨论】:

      【解决方案4】:
      $ rename 's/OneThing/AnotherThing/' *.extension
      

      【讨论】:

      • 鉴于原始问题要求提供副本,这实际上可能不会产生所需的结果
      【解决方案5】:

      扩展Jason Musgrove's solution:

      for FIL in OneThing*
      do
        NFIL=`echo $FIL | sed 's/OneThing/AnotherThing/'`
        cp "$FIL" "$NFIL"
      done
      

      【讨论】:

      • Douglas:哎呀,是的 - 我错过了将 echo $FIL 管道化到 sed 中。很好的收获。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2019-06-15
      • 2016-06-13
      • 1970-01-01
      相关资源
      最近更新 更多