查找尚未从一个目录复制到另一个文件树的文件(在 linux 中)

问题描述 投票:0回答:1

考虑我从一个磁盘(例如 SD 卡)复制文件的情况 到给定的目录,例如。

/home/pepa/dir1

但是,后来在 dir1 中创建了子目录,并将许多文件移动到这些子目录中。
过了一会儿,我想清理 SD,但我想先确保所有文件 来自 SD 的文件实际上存在于 dir1 或其任何子目录中。 我如何检查 SD 中的所有文件是否确实存在于 dir1 或其任何子目录中?
(通过终端中的命令行或特定的 linux 实用程序)

shell command-line utility
1个回答
0
投票

假设文件数量不是太大:

#!/bin/bash

sd=$1
dir1=$2

mksums()(
    if cd "$1"; then
        find -type f -exec sha256sum {} + |\
        sed 's/^\\//'
    fi
)

awk '
    NR==FNR { k=$1; sub(/^[^ ]* ./,""); a[k]=$0 ; next }
    { delete a[$1] }
    END { print "missing files:"; for(i in a) print a[i] }
' <(mksums "$sd") <(mksums "$dir1") 
  • 使用
    sha256sum
    计算 SD 上文件的校验和列表
  • 使用
    sha256sum
    计算 DIR1 中文件的校验和列表
  • 使用
    sed
    删除指标
    sha256sum
    添加到标志文件名中有奇怪的字符
  • 使用
    awk
    来匹配两个列表:
    • 为 SD 列表创建校验和到文件名的映射
    • 从映射中删除校验和出现在 DIR1 列表中的任何条目
    • 对于剩余的地图条目,打印相关的文件名

为清楚起见,省略了错误检查。


对于非常大量的文件,可以交替生成两个列表,

sort
,并提供给
comm

...
tmp=/my/tmp/folder

mksums "$sd"   | sort > "$tmp"/sd-sums
mksums "$dir1" | sort > "$tmp"/dir1-sums

comm -23 "$tmp"/sd-sums "$tmp"/dir1-sums |\
sed 's/^[^ ]* .//'
© www.soinside.com 2019 - 2024. All rights reserved.