如何仅部分匹配文件名的一个实例?

诺丁·洛菲(Nortine Lotfi)

因此,我有一个文件列表,我将其重命名为filename:hash

我想要做的是匹配哈希值,同时保持组合filename:hash完整,并且不再次计算其哈希值,因为文件没有更改。

在执行此操作时,我需要移动它们或将其删除,但是由于文件uniq名将使其对于该工具而言不够“唯一” ,因此如果直接使用管道,则此文件将无法正常工作。

有什么办法吗?不使用posix工具(如awk,bash等)以外的任何其他工具,并且不使用列表或数据库文件?

详细信息:,从技术上讲,这不是帖子的重复项是的,最终目标在技术上是相同的(即使用我已在另一篇帖子中介绍的方法/情况删除或移动重复项,或者这里)。

库萨兰达

使用bash(实际上不是POSIX工具,但是自从您明确提到它以来):

#!/bin/bash

names=( *:* )

printf '%s\n' "${names[@]##*:}" | sort | uniq -c |
while read count hash; do
    if [[ $count -gt 1 ]]; then
        echo 'Would delete/move these:'
        printf '%s\n' *:"$hash"
    fi
done

这会将当前目录中包含一个:字符的所有名称收集到数组中names假定该模式*:*匹配我们感兴趣的文件,并且没有其他文件具有这样的名称。

的扩展"${names[@]##*:}"将产生一个仅哈希列表,我们使用对其进行排序和计数sort | uniq -c

那结果被读入counthash在一个while read循环,如果计数大于一,我们知道,哈希被复制。如果哈希值重复,则该模式*:"$hash"将匹配具有该哈希值的所有名称。

如果要删除所有具有重复哈希的文件,则可以这样做

rm -f ./*:"$hash"

如果您要保留其中一个文件,则可以这样做,例如

dupnames=( ./*:"$hash" )
rm -f "${dupnames[@]:1}"

这会将数组dupnames设置为匹配的名称,并从文件系统中删除除第一个以外的所有名称。

您可能希望先启用一些调试输出,然后首先rm 禁用它,直到您确信自己确实可以运行为止:

#!/bin/bash

names=( *:* )

printf '%s\n' "${names[@]##*:}" | sort | uniq -c |
while read count hash; do
    if [[ $count -gt 1 ]]; then
        echo 'Would delete/move these:'
        dupnames=( ./*:"$hash" )
        echo rm -f "${dupnames[@]:1}"
    fi
done

sh上面的POSIX变体:

#!/bin/sh

for name in *:*; do
    printf '%s\n' "${name##*:}"
done | sort | uniq -c |
while read count hash; do
    if [ "$count" -gt 1 ]; then
        echo 'Would delete/move these:'
        set -- ./*:"$hash"
        shift
        echo rm -f "$@"
    fi
done

最后一个版本的一种变体,它sort | uniq -c通过以下方式消除awk

#!/bin/sh

for name in *:*; do
    printf '%s\n' "${name##*:}"
done |
awk '    { count[$0]++ }
     END { for (hash in count) if (count[hash] > 1) print hash }' |
while read hash; do
    echo 'Would delete/move these:'
    set -- ./*:"$hash"
    shift
    echo rm -f "$@"
done

awk代码段也可以替换sort | uniq -c此答案中的其他代码段,但是请注意,最终循环现在无需测试计数是否大于1,而仅读取哈希值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

仅当模式匹配一个时,如何通过文件模式将Makefile中的变量设置为文件名

来自分类Dev

仅当模式匹配一个时,如何通过文件模式将Makefile中的变量设置为文件名

来自分类Dev

搜索目录时,仅显示指定文件名的第一个实例

来自分类Dev

如何仅使用文件名的一部分将一个文件从一个目录移动到另一个没有 R 的目录?

来自分类Dev

Python:如何仅获取目录中的第一个文件名

来自分类Dev

如何找到一个模式并使用prename在文件名的匹配模式的两个部分之间插入一个字符的文件重命名?

来自分类Dev

如何创建一个唯一的文件名?

来自分类Dev

如何找到文件名,文件名都在一个文件中?

来自分类Dev

如果文件与另一个文件夹匹配,如何从一个文件夹返回所有文件名?

来自分类Dev

如何将一个几乎一致的文件名解析为有意义的部分?

来自分类Dev

脚本仅将多个文件的一个文件名输出到新文件

来自分类Dev

根据另一个文件内容中的完全匹配重命名文件名的一部分

来自分类Dev

根据另一个文件内容中的完全匹配重命名文件名的一部分

来自分类Dev

如何以分隔符仅包含第一个单词的方式剪切文件名

来自分类Dev

如何在Mac上的第一个点之后删除文件名的所有部分

来自分类Dev

文件名是一个变量

来自分类Dev

文件名是一个变量

来自分类Dev

搜索与另一个文件夹中的另一个文件名匹配的文件

来自分类Dev

diff仅将文件名存储在另一个文件中

来自分类Dev

在文件名的末尾与字符串匹配的目录中查找最后一个文件

来自分类Dev

GNU Make:在第一个点后删除文件名的所有部分

来自分类Dev

将文件名的最后一个数字部分复制到开头

来自分类Dev

一个衬里匹配文件名和正则表达式?

来自分类Dev

PHP:根据包含unix戳的文件名,从10000个文件的目录中仅获取一个文件

来自分类Dev

查找一个扩展名的文件名,但没有其他扩展名的匹配文件名

来自分类Dev

如何找出两个文件名是否引用同一个文件

来自分类Dev

将多个文件合并为一个文件,并在每个文件名后附加部分

来自分类Dev

SQL如何计算但如果两列匹配则仅计算一个实例?

来自分类Dev

在批处理中如何用另一个名称替换一部分文件名

Related 相关文章

  1. 1

    仅当模式匹配一个时,如何通过文件模式将Makefile中的变量设置为文件名

  2. 2

    仅当模式匹配一个时,如何通过文件模式将Makefile中的变量设置为文件名

  3. 3

    搜索目录时,仅显示指定文件名的第一个实例

  4. 4

    如何仅使用文件名的一部分将一个文件从一个目录移动到另一个没有 R 的目录?

  5. 5

    Python:如何仅获取目录中的第一个文件名

  6. 6

    如何找到一个模式并使用prename在文件名的匹配模式的两个部分之间插入一个字符的文件重命名?

  7. 7

    如何创建一个唯一的文件名?

  8. 8

    如何找到文件名,文件名都在一个文件中?

  9. 9

    如果文件与另一个文件夹匹配,如何从一个文件夹返回所有文件名?

  10. 10

    如何将一个几乎一致的文件名解析为有意义的部分?

  11. 11

    脚本仅将多个文件的一个文件名输出到新文件

  12. 12

    根据另一个文件内容中的完全匹配重命名文件名的一部分

  13. 13

    根据另一个文件内容中的完全匹配重命名文件名的一部分

  14. 14

    如何以分隔符仅包含第一个单词的方式剪切文件名

  15. 15

    如何在Mac上的第一个点之后删除文件名的所有部分

  16. 16

    文件名是一个变量

  17. 17

    文件名是一个变量

  18. 18

    搜索与另一个文件夹中的另一个文件名匹配的文件

  19. 19

    diff仅将文件名存储在另一个文件中

  20. 20

    在文件名的末尾与字符串匹配的目录中查找最后一个文件

  21. 21

    GNU Make:在第一个点后删除文件名的所有部分

  22. 22

    将文件名的最后一个数字部分复制到开头

  23. 23

    一个衬里匹配文件名和正则表达式?

  24. 24

    PHP:根据包含unix戳的文件名,从10000个文件的目录中仅获取一个文件

  25. 25

    查找一个扩展名的文件名,但没有其他扩展名的匹配文件名

  26. 26

    如何找出两个文件名是否引用同一个文件

  27. 27

    将多个文件合并为一个文件,并在每个文件名后附加部分

  28. 28

    SQL如何计算但如果两列匹配则仅计算一个实例?

  29. 29

    在批处理中如何用另一个名称替换一部分文件名

热门标签

归档