2017-04-26 114 views
2

我有一组文件,这些文件的名称相似:不匹配特定的字符串格式删除文件

TEXT_TEXT_YYYYMMDD 

示例文件名:

My_House_20170426 

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

有人可以提供一些建议,如何建立一个findremove语句,将删除不符合这种格式的文件?

+1

到目前为止您尝试过什么?提示:尝试使用'echo My_House_20170426 | grep -E'pattern',直到它匹配正确。然后使用grep的'-q'选项并像这样使用它:'if echo $ filename | grep -qE模式;那么......' – Harvey

+1

其实看看你是否可以使用'find path -not -regex pattern -delete'。先不用'-delete'来测试。 – Harvey

+2

wrt'YYYYMMDD的日期戳记 - 如果一个文件被命名为'text_text_86753090'或者其他一些不是有效日期的8位数字的组合?删除它或保留它? –

回答

4

使用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]

+0

可能有几件事要考虑,否则这是一个体面的解决方案。至少在文件名中包含数字的情况下,我可能会使用'[a-z0-9]',否则像'file1_name_20170425'这样的文件也没有了。另一件我可能会提到的是,如果有一个目录'some_directory_123',它不会被删除,如果它有一个不应该被删除的文件 - 这可能是好的,只是指出。 –

+0

@ l'L我所有的好点。我会更新答案。 – Harvey

+0

这很好。谢谢! – JimRomeFan

1
grep -v '(pattern)' 

将过滤掉与模式匹配的行,留下那些不匹配的行。你可以尝试输入ls的输出。如果你特别勇敢,你可以将输出输出为xargs rm。但删除有点吓人,所以也许先将输出保存到文件中,然后查看它,然后删除列出的文件。

+0

+1,建议不要使用'xargs rm',直到您首先找到正确的文件为止。最后要做的事情是回来问是否有恢复意外删除的文件 – KeithC