【问题标题】:Compare filenames (without extension) from "Dir1" to subfolder "Dir2" assuming I'm at "Dir1"假设我在“Dir1”,比较从“Dir1”到子文件夹“Dir2”的文件名(不带扩展名)
【发布时间】:2018-03-23 20:39:44
【问题描述】:

我正在尝试比较没有扩展名的 Dir1 和 Dir2 文件名。 Dir2 是 Dir1 的子文件夹,所以我从 Dir1 启动脚本。

Dir1/proof1.txt
Dir1/proof2.txt
Dir1/proof3.txt
Dir1/proof4.txt
Dir1/proof5.txt
Dir1/proof6.txt

Dir1/Dir2/proof1.png
Dir1/Dir2/proof2.png
Dir1/Dir2/proof5.png

我想要的输出是存在于 Dir1 但不存在于 Dir2 的文件名:

proof3
proof4
proof6

这是我正在使用(不工作)来查找位于 Dir1 但不在 Dir2 的文件:

(find .-printf '%P\n' | grep -v Dir2 && find Dir2/ -printf '%P\n' && find Dir2/ -printf '%P\n') |排序 |唯一的 -u

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    只有文件名干净且没有空格的 testet:

    for f in proof*.txt ; do test -f "Dir2/$(basename "$f" .txt).png" || echo no match "$f"; done
    
    • Test -f 测试文件是否存在并且是普通文件。
    • basename 删除扩展名,如果给定了

    【讨论】:

      【解决方案2】:

      这应该可以...

      $ comm -23 <(ls -1 | cut -d. -f1) <(ls -1 Dir2/ | xargs -n 1 basename | cut -d. -f1)
      

      如果您的文件名中包含 . 而不是分隔扩展名,则可能无法按预期工作。

      【讨论】:

      • 非常感谢,辛苦了!如果“proof1”位于 Dir1 和 Dir2,你知道为什么输出会在顶部显示“proof1”吗?这是输出:proof1 proof3 proof4 proof 6
      • 因为扩展被修剪也许你有两个副本?在cut 之后添加uniq 应该可以解决它。
      • 不,没有两个副本,但您的“uniq”解决方案有效!现在我正在尝试接受空格和“。”除了分离扩展,但我认为这是一个不同的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 2021-07-08
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多