【问题标题】:remove with bash lots of files with spaces in their names使用 bash 删除大量名称中带有空格的文件
【发布时间】:2020-08-09 15:00:13
【问题描述】:

好吧,我的问题似乎与这个有关: Trouble in script with spaces in filename 但是当您必须处理一堆这些文件时,答案似乎并没有解决问题。 假设我得到了一些我想用find 删除的文件的文件名,并将它们放在一个文本文件中。然后我想删除它们,比如rm。 rm 似乎无法解释文件名的空格,即使我手动将名称放在引号内! 你有什么建议?

【问题讨论】:

标签: bash parsing filenames


【解决方案1】:

这取决于您实际处理文件列表的方式(您尚未显示)。假设您在文件中的每一行都有一个:

:: cat list
thishasnospaces
but this does

如果它们有空格,即使这样的东西也不会起作用:

:: for fspec in $(cat list) ; do echo "rm -f \"${fspec}\"" ; done
rm -rf "thishasnospaces"
rm -rf "but"
rm -rf "this"
rm -rf "does"

这是因为这会将所有空白区域视为相同。但是,您可以使用while 循环来做到这一点:

:: cat list | while read ; do echo "rm -f \"$REPLY\""; done
rm -f "thishasnospaces"
rm -f "but this does"

您会看到它保留了每行方面的内容。当您对它的工作感到满意时,只需移除回声即可。

:: cat list | while read ; do rm -f "$REPLY"; done

但请记住,这可能都是不必要的。 find 命令已经具有删除它找到的文件的能力,使用-delete 选项。如果你可以使用它,文件名中的空格就会少得多。

【讨论】:

  • 完美。哦,我不知道 find 可以删除,但是这样做会很糟糕,有几个我不想删除的例外是我手动选择的。
【解决方案2】:

为什么需要文本文件? 尝试类似:

touch "a b"
touch "c d"
find . -name "* *" -exec rm "{}" \;

祝你好运!

【讨论】:

  • 因为我想在删除之前检查它们。
  • OK 然后:找到 . -name "* *" -exec echo "{}" >> test \;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多