【问题标题】:How can I delete all files in my folder, except Music -subfolder?如何删除文件夹中的所有文件,音乐子文件夹除外?
【发布时间】:2009-01-17 16:53:46
【问题描述】:

复制

Unable to remove everything else in a folder except FileA

我猜它和这个有点相似: 删除[^音乐]

但是,它不起作用。

【问题讨论】:

  • 你已经问过这个问题(亚当给出了接受的答案)。为什么要再次发布?
  • @Can:我没有再发了。我将旧问题编辑为最新。我无法删除它。
  • @Masi:是的,我刚刚注意到。实际上,另一个问题是重复的。无论哪种方式,我认为应该关闭一个。
  • @请关闭这个不再相关的问题。

标签: shell terminal


【解决方案1】:

将以下命令放入您的 ~/.bashrc

shopt -s extglob 

您现在可以删除文件夹中除 Music 文件夹以外的所有内容

rm -r !(Music)

请注意命令。 它很强大,但也很危险。

我建议始终使用命令对其进行测试

echo rm -r !(Music)

【讨论】:

  • 他询问了鱼壳,这是一个 bash 选项。它也适用于 config.fish 吗?
  • @bjeanes:鱼壳有问题,所以我改变了问题。我在回答这个问题时考虑了 Bash。
  • "rm -r !(Music)" 在 gnome-terminal 中有效,但在 .sh 文件中无效。它说“意外标记'('附近的语法错误”
  • 如果你想在 .sh 文件中使用这个命令,你可以像这样使用它: shopt -s extglob rm -r !(client-deployment-webapp) 它对我有用。谢谢。
  • @SaeedZarinfam 请注意,在您的脚本中,您需要在 extglobrm 之间使用分号或换行符。
【解决方案2】:

命令

rm (ls | grep -v '^Music$')

应该可以。如果您的某些“文件”也是子目录,那么您也想递归删除它们:

rm -r (ls | grep -v '^Music$')

警告rm -r 可能很危险,您可能会意外删除大量文件。如果您想确认要删除的内容,请尝试查看

的输出
ls | grep -v '^Music$'

解释

  • ls 命令列出目录内容;不带参数,默认为当前目录。
  • 管道符号| 将输出重定向到另一个命令;当ls 的输出以这种方式重定向时,它每行打印一个文件名,而不是像在交互式终端上键入ls 时看到的列格式。
  • grep 命令匹配模式的行; -v 开关表示打印与模式匹配的行。
  • 模式^Music$表示匹配以Music开头和结尾的行——即只匹配字符串Music; ^(行首)和$(行尾)字符的效果也可以通过-x开关实现,如grep -vx Music
  • command (subcommand) 语法是 fish 获取一个命令的输出并将其作为命令行参数传递给另一个命令的方式。
  • rm 命令删除文件。默认情况下,它不会删除目录,但 -r ("recursive") 选项会改变这一点。

您可以通过输入man command 了解这些命令及更多信息,其中command 是您想了解的内容。

【讨论】:

  • "rm -r (ls | grep -v '^Music$')" 在 gnome-terminal 中有效,但在 .sh 文件中无效。它说“意外标记'('附近的语法错误”
  • 添加rm -r $(ls | grep -v '^Music$')@SaeedZarinfam
【解决方案3】:

所以我一直在寻找一种方法来删除目录中的所有文件,除了一些我想保留的目录和文件。经过大量搜索后,我设计了一种使用 find 的方法。

find -E . -regex './(dir1|dir2|dir3)' -and -type d -prune -o -print -exec rm -rf {} \;

基本上它使用正则表达式来选择要从结果中排除的目录,然后删除剩余的文件。只是想把它放在这里以防其他人需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多