【问题标题】:Delete files that don't match a particular string format删除与特定字符串格式不匹配的文件
【发布时间】:2017-09-24 13:29:28
【问题描述】:

我有一组名称相似的文件:

TEXT_TEXT_YYYYMMDD

示例文件名:

My_House_20170426

我正在尝试删除所有与此格式不匹配的文件。每个文件都应该有一个文本字符串,后跟一个下划线,然后是另一个文本字符串和另一个下划线,然后是 YYYYMMDD 的日期戳。

有人可以就如何构建findremove 语句来删除与此格式不匹配的文件提供一些建议吗?

【问题讨论】:

  • 到目前为止您尝试过什么?提示:尝试使用echo My_House_20170426 | grep -E 'pattern' 直到它正确匹配。然后使用grep的-q选项,这样使用:if echo $filename | grep -qE pattern ; then ...
  • 其实看看能不能用find path -not -regex pattern -delete。在没有-delete 的情况下先测试。
  • wrt a date stamp of YYYYMMDD - 如果文件名为 text_text_86753090 或其他一些不是有效日期的 8 位数字组合怎么办?删除还是保留?
  • 只要有八位数字,我就可以确保数据格式正确。

标签: linux bash macos find


【解决方案1】:

使用find,一旦你确定它有效,就在末尾添加-delete

# gnu find
find . -regextype posix-egrep -type f -not -iregex '.*/[a-z]+_[a-z]+_[0-9]{8}'

# OSX find
find -E . -type f -not -iregex '.*/[a-z]+_[a-z]+_[0-9]{8}'

故意只匹配 TEXT 的字母字符。如果您需要数字,请将0-9 添加到每个文本区域,例如[a-z0-9]

【讨论】:

  • 这里可能需要考虑几件事,否则这是一个不错的解决方案。我可能会使用[a-z0-9] 至少以防文件名中包含数字,否则像file1_name_20170425 这样的文件也会消失。我可能会提到的另一件事是,如果有一个目录some_directory_123,如果它有一个不应该在其中删除的文件,它将不会被删除——这可能很好,只是指出这一点。
【解决方案2】:
grep -v '(pattern)'

将过滤掉与模式匹配的行,留下不匹配的行。您可以尝试在ls 的输出中使用管道。如果您特别勇敢,可以将输出通过管道传输到 xargs rm 之类的东西。但是删除有点吓人,所以可以先将输出保存到一个文件中,查看它,然后删除列出的文件。

【讨论】:

  • +1 建议不要使用xargs rm,直到您可以先找到正确的文件。你最不想做的就是回来询问是否有办法恢复意外删除的文件
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 2017-03-10
  • 2015-01-11
  • 2010-11-26
  • 2012-10-09
相关资源
最近更新 更多