我是一名 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
并将此列表传递rm
给R埃米复制当前目录中所有同名文件。
答案3
为了扩展 Pynt 概念上正确的解决方案,您可以使用 find 和 xargs 的空分隔符选项来处理名称中带有空格的文件:
假设您的下载文件夹是~/Downloads/
,其中包含文件file 4
和file 5
。您实际上想要下载一组文件(file 1
、file 2
和file 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 命令的更多信息,我强烈推荐。)如果你宁愿过危险的生活,用 替换trash
。rm
如果你想过得更安全较少的危险的是,trash
用替换echo trash
。这将仅打印删除文件的命令。
无论如何,下面是解释,因为您永远不应该相信您不理解的代码。第一行只是进入下载目录。第二行查找并打印 中的所有文件的名称subdir
。pushd
和popd
就像 一样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 "$@"