AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 672996
Accepted
Eduard Florinescu
Eduard Florinescu
Asked: 2021-10-13 23:53:15 +0800 CST2021-10-13 23:53:15 +0800 CST 2021-10-13 23:53:15 +0800 CST

如何查看连续数字名称文件是否缺少某些文件?[复制]

  • 772
这个问题在这里已经有了答案:
如何查找具有顺序名称的丢失文件?[重复] (4个答案)
如何打印文件夹中丢失文件的名称? (4 个回答)
去年关闭。

社区在10 个月前审查了是否重新打开此问题并将其关闭:

重复此问题已得到回答,不是唯一的,并且与另一个问题没有区别。

如果我给ls -1我得到这样的,

file_0001.jpeg
file_0002.jpeg
file_0003.jpeg
file_0004.jpeg
file_0005.jpeg
file_0006.jpeg
file_0007.jpeg
file_0008.jpeg
file_0009.jpeg
file_0010.jpeg
file_0011.jpeg
file_0012.jpeg
file_0013.jpeg
file_0014.jpeg
file_0015.jpeg
file_0016.jpeg
file_0017.jpeg
file_0018.jpeg
file_0019.jpeg
file_0020.jpeg
file_0021.jpeg
...
file_0999.jpeg

有没有办法使用awk或其他工具来查看是否以这种连续增量方式丢失了某些文件。

awk utilities
  • 7 7 个回答
  • 1518 Views

7 个回答

  • Voted
  1. Jim L.
    2021-10-14T08:34:48+08:002021-10-14T08:34:48+08:00

    如果您使用的是bashshell,您可以使用seq或jot创建一个“完美”的输出参考样本,然后将输出ls -1与该参考进行比较:

    $ diff <(ls -1) <(seq -f 'file_%04g.jpeg' 999)
    

    这不仅会显示任何丢失的文件,还会发现无关文件。

    • 12
  2. SE - stop firing the good guys
    2021-10-14T14:28:07+08:002021-10-14T14:28:07+08:00

    虽然其他答案提供了准确查找丢失哪些文件的方法,但可以以更易于输入的方式检查查看某些文件是否丢失的原始问题。

    您的列表是 的输出ls -1,因此通过管道将其输入 wc 应该会为您提供许多与最后一个条目的名称匹配的文件。

    ls -1 | wc -l

    如果计数与最后一个文件的名称不匹配,则必须有一个丢失的文件。

    • 12
  3. Best Answer
    Inian
    2021-10-14T00:07:13+08:002021-10-14T00:07:13+08:00

    您可以使用 awk 过滤掉丢失的。在 GNU Awk 上,支持多字符 FS,您可以将结果通过管道传输到

    awk -F'[_.]' ' $2 != prev+1 { print "file "  prev+1 " missing" }{ prev = $2 }'
    

    或使用perl

    perl -F'[_.]' -ane 'if ($F[1] != $prev+1) {printf "file %d missing\n",$prev+1}; $prev=$F[1]'
    

    如果预计会有更多空白,您可以awk打印出丢失的文件编号范围。修改以上内容

    awk -F'[_.]' ' $2 != prev+1 { print "file(s) "  prev+1 "-" $2-1 " missing" }{ prev = $2 }' file
    
    • 11
  4. JoL
    2021-10-14T08:41:35+08:002021-10-14T08:41:35+08:00

    您可以使用 过滤comm。

    例如,在包含此类文件的目录中缺少一些文件时:

    $ cd "$(mktemp -d)"
    $ touch file_{0001..0999}.jpeg
    $ rm file_0388.jpeg file_0795.jpeg
    

    您可以像这样过滤:

    $ ls | comm -13 - <(printf 'file_%s.jpeg\n' {0001..0999})
    file_0388.jpeg
    file_0795.jpeg
    

    comm是一个比较 2 个文件的命令,显示哪些行仅存在于文件 1 中,哪些行仅存在于文件 2 中,哪些行都存在于两者中。-1抑制仅存在于文件 1 中的-2行,抑制仅存在于文件 2 中-3的行,并抑制存在于两者中的行。

    -13与 相同-1 -3,它会抑制除仅存在于文件 2 中的行之外的所有行,即生成的文件名。

    目录中的无关文件可以通过使用-23而不是列出-13:

    $ touch foo.txt bar.txt
    $ ls | comm -23 - <(printf 'file_%s.jpeg\n' {0001..0999})
    bar.txt
    foo.txt
    

    不使用这些选项,可以看到缩进区分的所有内容。仅在文件 1 中的行没有缩进,仅在文件 2 中的行有 1 个制表符缩进,并且两者中都存在的行有 2 个制表符缩进:

    $ ls | comm - <(printf 'file_%s.jpeg\n' {0001..0999})
    bar.txt
            file_0001.jpeg
    ...
            file_0386.jpeg
            file_0387.jpeg
        file_0388.jpeg
            file_0389.jpeg
            file_0390.jpeg
    ...
            file_0793.jpeg
            file_0794.jpeg
        file_0795.jpeg
            file_0796.jpeg
            file_0797.jpeg
    ...
            file_0998.jpeg
            file_0999.jpeg
    foo.txt
    
    • 5
  5. Abdullah Ibn Fulan
    2021-10-14T00:09:43+08:002021-10-14T00:09:43+08:00

    使用 for 循环。

     for i in file_{0000..0999}.jpeg; do if !  test -e "$i" ; then echo "$i doesn't exist"; fi; done
    

    作为脚本

    #! /bin/bash
    for i in file_{0000..0999}.jpeg
    do 
    if !  test -e "$i"
    then
    echo "$i doesn't exist"
    fi
    done
    
    • 4
  6. francois P
    2021-10-14T00:02:30+08:002021-10-14T00:02:30+08:00

    一个简单的方法是从seq命令循环数字

    francois@zaphod:/tmp/tata$
     ls
    file_0.txt   file_1.txt   file_2.txt   file_3.txt   file_4.txt   file_60.txt  file_70.txt  file_80.txt  file_90.txt
    file_10.txt  file_20.txt  file_30.txt  file_40.txt  file_50.txt  file_61.txt  file_71.txt  file_81.txt  file_91.txt
    file_11.txt  file_21.txt  file_31.txt  file_41.txt  file_51.txt  file_62.txt  file_72.txt  file_82.txt  file_92.txt
    file_12.txt  file_22.txt  file_32.txt  file_42.txt  file_52.txt  file_63.txt  file_73.txt  file_83.txt  file_93.txt
    file_13.txt  file_23.txt  file_33.txt  file_43.txt  file_53.txt  file_64.txt  file_74.txt  file_84.txt  file_94.txt
    file_14.txt  file_24.txt  file_34.txt  file_44.txt  file_55.txt  file_65.txt  file_75.txt  file_85.txt  file_95.txt
    file_15.txt  file_25.txt  file_35.txt  file_45.txt  file_56.txt  file_66.txt  file_76.txt  file_86.txt  file_96.txt
    file_16.txt  file_26.txt  file_36.txt  file_46.txt  file_57.txt  file_67.txt  file_77.txt  file_87.txt  file_97.txt
    file_17.txt  file_27.txt  file_37.txt  file_47.txt  file_58.txt  file_68.txt  file_78.txt  file_88.txt  file_98.txt
    file_18.txt  file_28.txt  file_38.txt  file_48.txt  file_59.txt  file_69.txt  file_79.txt  file_89.txt  file_99.txt
    file_19.txt  file_29.txt  file_39.txt  file_49.txt  file_5.txt   file_6.txt   file_7.txt   file_8.txt   file_9.txt
    francois@zaphod:/tmp/tata$
     for i in $(seq 0 99) ; do test -f file_$i.txt || echo "file_$i.txt missing" ; done                                    
    file_54.txt missing
    francois@zaphod:/tmp/tata$
    

    只需在您自己的文件名中适应您的 4 位数字格式

    • 3
  7. Peter Cordes
    2021-10-16T17:58:52+08:002021-10-16T17:58:52+08:00

    (原来这个问题是重复的,我使用的与如何打印文件夹中丢失文件的名称的最佳答案相同?)


    对于 bash 中的交互使用,快速且易于键入和记住:
    我通常使用{01..99}大括号扩展来生成预期的系列并查找ls错误:

    ls file_0{001..999}.jpeg > /dev/null
    

    重定向隐藏了现有文件的标准输出列表,但标准错误仍然连接到终端。>/dev/null如果文件少于〜100个,我有时会忽略并在终端中向后滚动,因为错误消息首先出现,而ls在排序和打印它们之前仍在阅读其参数。这也验证了我是否输入正确并且我的模式与我想要的文件匹配(尤其是如果它包含一个 glob)。

    对于管道/捕获,您可以foo=$(ls ... 2>&1 >/dev/null)将 stderr 重定向到管道,然后将 stdout 重定向到 /dev/null,同时让 stderr 进入 shell 的管道。这对于检查空/非空错误输出很有用。但是在脚本中,如果您想获取丢失文件的名称ls,请查看其他答案,而不是尝试将其从可能被国际化的错误消息中解析出来等。

    如果需要 / 如果需要,可以在文件名的其他部分使用引号,例如'foo bar '{01..22}.jpg. 甚至foo\ bar\ {01..22}*.jpg扩展为'foo bar '01*.jpg/'foo bar '02*.jpg等,因此即使在序列号以外的某个地方的某些或所有文件有一些额外的唯一名称,它也可以工作。

    即使您的编号不使用前导零(例如{1..99}代替{01..99}. 如果您想在大括号范围内包含前导零,您可以{01..09}按照您希望的方式执行类似的操作,而不是像我在示例中所做的那样将它们从大括号表达式中分解出来。


    请注意,现代 Linux 系统支持非常长的 arg 列表,例如 128kiB 的 text。这种方法确实依赖于生成一个包含每个文件的命令行。这对于交互式使用来说是 100% 没问题的:在列表太大的罕见情况下,shell 会告诉你它。

    另一个答案for在列表上使用了一个循环,这会更慢(ls为每个文件启动一个单独的文件),但即使在巨大的或更有限的系统上也安全,argv 限制要小得多。

    • 2

相关问题

  • 根据第一个逗号之前的匹配删除重复行数

  • 在另一个文件之后逐行追加行

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve