在 Linux 中,如何删除已下载到目录中现在与其他文件混合的文件而不删除其他文件

在 Linux 中,如何删除已下载到目录中现在与其他文件混合的文件而不删除其他文件

我是一名 Linux 用户。我意外地将一堆文件下载到了错误的目录中。它们现在与我的其他文件混在一起了。然后我创建了一个新子目录并再次下载了所有文件,这次是下载到了子目录中。有什么最好的方法可以删除我意外下载到目录中的所有文件,而不会意外删除任何现有文件。我是 Linux 新手,需要一些帮助。我想可以按日期删除,也可以对子目录中的每个文件说,删除目录中同名的文件。提前致谢!-- Larry

答案1

如果文件修改时间一致,那么您可以使用和的变体来touch定位find要删除的文件。假设您今天(2009-09-08)12:34 之后下载了这些文件:

touch 20090908123400 empty.file
find . -newer empty.file -print

这将列出文件。当您确定您获得了正确的文件时,您可以将命令修改find为:

find . -newer empty.file -print0 | xargs -0 rm -f

使用“ -print0”和“ -0”选项意味着管道将正确处理带有空格和所有其他特殊字符的文件名。您还可以使用-older具有不同时间戳的第二个空文件来构造时间。

如果下载保留了远程系统上文件的修改时间,那么你可能被骗了。不过,这不太可能是个问题。

答案2

实际上这很容易做到。 cd进入您意外下载文件的目录并运行以下代码,将子目录替换为包含您第二次下载的文件的子目录的名称。

rm `ls subdirectory`

它的作用是列出所有内容,subdirectory并将此列表传递rmR复制当前目录中所有同名文件。

答案3

为了扩展 Pynt 概念上正确的解决方案,您可以使用 find 和 xargs 的空分隔符选项来处理名称中带有空格的文件:

假设您的下载文件夹是~/Downloads/,其中包含文件file 4file 5。您实际上想要下载一组文件(file 1file 2file 3)到子目录~/Downloads/subdir/。您意外地将这些文件下载到了 ~/Downloads/ ,然后您又将它们正确地下载到了 ~/Downloads/subdir/ 。因此,您当前的情况如下所示:

$ tree ~/Downloads/
.
|-- file 1
|-- file 2
|-- file 3
|-- file 4
|-- file 5
`-- subdir
    |-- file 1
    |-- file 2
    `-- file 3

要删除正确的文件,请尝试以下操作:

$ cd ~/Downloads
$ { pushd subdir; find -mindepth 1 -maxdepth 1 -print0; popd; } |\
  xargs --null -I'{}' trash '"{}"

该代码将不是删除文件。只要您安装了 trash-cli 包,它就会将它们发送到垃圾箱。(请参阅撤消 Linux 的 rm?有关 trash 命令的更多信息,我强烈推荐。)如果你宁愿过危险的生活,用 替换trashrm如果你想过得更安全较少的危险的是,trash用替换echo trash。这将仅打印删除文件的命令。

无论如何,下面是解释,因为您永远不应该相信您不理解的代码。第一行只是进入下载目录。第二行查找并打印 中的所有文件的名称subdirpushdpopd就像 一样cd,只有一个后退按钮。(如果您想知道“推送”和“弹出”来自哪里,请查找堆栈。)选项告诉find它只列出 中的东西subdir,而不是,例如subdir/another subdir/third subdir。它们还告诉它不要列出.,即当前目录本身的名称。您不想删除它。最后,选项-print0告诉find打印它找到的文件,但用空字符而不是空格将它们分开。这就是我们处理空格的方式。

同样,在第三行中,--null选项xargs告诉它文件名之间find用空字符分隔。第三行的其余部分构成了删除文件的命令。

总的来说,教训是,您需要处理可能有空格的文件,通常需要使用涉及的命令find -print0 | xargs --null

答案4

Pynt 和 Peltier 有这个基本思想,但只有 Peltier 会处理带有空格的文件。

这应该有效:

cd path-to-subdirectory
set -- *
cd -
ls -ld "$@" | more    # Make sure the list is what you expect to remove, then:
rm -rf "$@"

为了确保理智,我显示使用“ls”在删除之前确认文件列表。

但如果您担心删除错误的内容,您也可以将它们移动到临时位置(包括 ZIP 存档)。只需将上面的“rm”替换为以下任一内容,然后如果您相信所发生的事情,请删除 ZIP 或临时目录:

mkdir /tmp/to-nuke ; mv -vi "$@" /tmp/to-nuke
zip -0rm backup.zip "$@"

相关内容