我有一组文件,这些文件的名称相似:不匹配特定的字符串格式删除文件
TEXT_TEXT_YYYYMMDD
示例文件名:
My_House_20170426
我试图删除所有与此格式不匹配的文件。每个文件都应该有一串文本,后跟一个下划线,后跟另一个文本字符串和另一个下划线,然后是日期标记YYYYMMDD。
有人可以提供一些建议,如何建立一个find
或remove
语句,将删除不符合这种格式的文件?
我有一组文件,这些文件的名称相似:不匹配特定的字符串格式删除文件
TEXT_TEXT_YYYYMMDD
示例文件名:
My_House_20170426
我试图删除所有与此格式不匹配的文件。每个文件都应该有一串文本,后跟一个下划线,后跟另一个文本字符串和另一个下划线,然后是日期标记YYYYMMDD。
有人可以提供一些建议,如何建立一个find
或remove
语句,将删除不符合这种格式的文件?
使用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',它不会被删除,如果它有一个不应该被删除的文件 - 这可能是好的,只是指出。 –
@ l'L我所有的好点。我会更新答案。 – Harvey
这很好。谢谢! – JimRomeFan
grep -v '(pattern)'
将过滤掉与模式匹配的行,留下那些不匹配的行。你可以尝试输入ls
的输出。如果你特别勇敢,你可以将输出输出为xargs rm
。但删除有点吓人,所以也许先将输出保存到文件中,然后查看它,然后删除列出的文件。
+1,建议不要使用'xargs rm',直到您首先找到正确的文件为止。最后要做的事情是回来问是否有恢复意外删除的文件 – KeithC
到目前为止您尝试过什么?提示:尝试使用'echo My_House_20170426 | grep -E'pattern',直到它匹配正确。然后使用grep的'-q'选项并像这样使用它:'if echo $ filename | grep -qE模式;那么......' – Harvey
其实看看你是否可以使用'find path -not -regex pattern -delete'。先不用'-delete'来测试。 – Harvey
wrt'YYYYMMDD的日期戳记 - 如果一个文件被命名为'text_text_86753090'或者其他一些不是有效日期的8位数字的组合?删除它或保留它? –