我用这个复制了一个目录:
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
说明:
- 列出 PATH_DIR1 中的所有文件名
查找 PATH_DIR1 -type f -exec 基本名称 '{}' ';'
- 使用 PATH_DIR2 中的现有文件过滤先前的列表(查找相交数据)
xargs printf -- 'PATH_DIR2/%s\n'
- 对过滤后的结果执行删除操作
xargs rm