删除一个目录中同时位于另一个目录中的文件

删除一个目录中同时位于另一个目录中的文件

我用这个复制了一个目录:

cp -r dir/ ../../

不假思索地意识到它复制了内容dir而不是实际dir到上面的目录。现在我需要删除一堆乱七八糟的文件,以便我可以cp正确地重做。如果我错误复制的所有文件与特定内容不匹配,如何删除它们?

答案1

好的,这基本上是一样的克拉鲍修斯的回答。 (如果cp覆盖了一些现有文件,它不会修复造成的任何损坏。)

假设您位于源目录(in dir)中。这个命令:

find . -type f -exec echo '{}' ';'

将列出目录中存在的所有文件(递归地)dir(非常像-print)。该-type f选项可以防止列出子目录。

所以,如果您使用:

find dir -type f -exec echo '../../../{}' ';'

这应该列出目标目录中的相应文件(副本)。

现在,如果列表正确,您将能够使用以下方法删除副本:

find dir -type f -exec rm -- '../../../{}' ';'

至于修剪剩余的空目录,这些目录来自cp……嗯……

答案2

find与 结合使用-exec。更好地像ls这样测试之前:

find . -name "*" -exec ls ../../{} \;

答案3

以下代码处理包含嵌入换行符的文件名,我已在其上放置了完整版本脚本粘贴.ubuntu。它检查是否存在和匹配大小...生成测试数据的代码也包含在那里。

# This lists the original fully-qualified filename, 
# and its would-be counterpart (assuming it exists) 
unset a i
while IFS= read -r -d $'\0' relf; do
    printf "%s\n$s" "$PWD${relf:1}" "$(dirname "$(dirname "$PWD")")${relf:1}"
done < <(find  . -type f  \! -name '.' -name '*' -print0)

这是完整版本(如上所述)的示例输出,其中一个文件丢失,而另一个文件的文件大小与原始文件不同

WARNING -----
NOT in target   ./file1
ok --------
sizes match     ./c/file4-in-subdir
WARNING ------
size mis-match  ./file3   is   triple-spaced
ok --------
sizes match     ./file2
has newline!

答案4

您想要将 PATH_DIR2 中的现有文件删除到 PATH_DIR1 中:

find PATH_DIR1 -type f  -exec basename '{}' ';' | xargs printf -- 'PATH_DIR2/%s\n' | xargs rm

说明:

  1. 列出 PATH_DIR1 中的所有文件名

查找 PATH_DIR1 -type f -exec 基本名称 '{}' ';'

  1. 使用 PATH_DIR2 中的现有文件过滤先前的列表(查找相交数据)

xargs printf -- 'PATH_DIR2/%s\n'

  1. 对过滤后的结果执行删除操作

xargs rm

相关内容