Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 删除除一个时间戳文件外的所有文件_Bash_Shell_Grep_Find - Fatal编程技术网

Bash 删除除一个时间戳文件外的所有文件

Bash 删除除一个时间戳文件外的所有文件,bash,shell,grep,find,Bash,Shell,Grep,Find,我有一组时间戳文件,如下所示: ./mysql_foo_bar_hostname_table1_mysql_dump_20160927112627.dmp ./mysql_foo_bar_hostname_table2_mysql_dump_20160927121555.dmp ./mysql_foo_bar_hostname_table3_mysql_dump_20160927121703.dmp ./mysql_foo_bar_hostname_table4_mysql_dump_20160

我有一组时间戳文件,如下所示:

./mysql_foo_bar_hostname_table1_mysql_dump_20160927112627.dmp
./mysql_foo_bar_hostname_table2_mysql_dump_20160927121555.dmp
./mysql_foo_bar_hostname_table3_mysql_dump_20160927121703.dmp
./mysql_foo_bar_hostname_table4_mysql_dump_20160927112718.dmp
./mysql_foo_baz_hostname_table5_mysql_dump_20160919122659.dmp
./mysql_foo_bar_hostname_table6_mysql_dump_20160927110851.dmp
./mysql_foo_bar_hostname_table7_mysql_dump_20160927133419.dmp
./mysql_foo_bar_hostname_table6_mysql_dump_20160927100456.dmp
./mysql_foo_bar_hostname_table6_mysql_dump_20160927113037.dmp
./mysql_foo_bar_hostname_table6_mysql_dump_20160927102752.dmp
./mysql_foo_bar_hostname_table6_mysql_dump_20160927095924.dmp
./mysql_foo_baz_hostname_table8_mysql_dump_20160919140536.dmp
./mysql_foo_bar_hostname_table9_mysql_dump_20160927100730.dmp
我希望保留具有相同“前缀”(即“\u
.dmp”(前缀是时间戳之前的所有内容)的所有文件中的最新文件

例如,在上面的列表中,我想保留
mysql\u foo\u bar\u hostname\u table6\u mysql\u dump\u 20160927113037.dmp
,所有其他的都有唯一的“前缀”,所以我也想保留它们。我通常在bash工作,但如果有更有效的方法,我很高兴知道。提前感谢您的帮助。

eval“$(\
eval "$( \
  ls \
  | awk -F '_dump_|.dmp' '
     {
     if ( Dates[$1] < $2 ) Dates[$1] = $2
      else Files[$0]++
     }
     END {
       for (File in Files) if ( Files[File] == 1) print "rm " Files[ File]
       }'
  )"
ls\ |awk-F'_dump_124;.dmp'' { 如果(日期[$1]<$2)日期[$1]=$2 其他文件[$0]++ } 结束{ 对于(文件中的文件)如果(文件[文件]==1)打印“rm”文件[文件] }' )"
  • 使用awk创建具有“非最大”时间值文件的delete cmd(基于名称)
  • 假设没有空间文件名(如示例中所示)
  • 如果文件的实时性与名称相同,则可以使用
    ls-t
  • 使用非“oneliner”更明确,如果需要,oneliner很容易制作
  • 我不鼓励这种工作,因为任何由于文件名不好而出错的情况都可能发生,因此
    ls-t./mysql\u foo\u bar\u hostname.*.dmp
    是最低安全性要求

在批量删除文件之前,应该小心。因此,首先进行一次试运行。更改到包含这些文件的目录(
cd$DIR
),然后运行:

这将生成您要删除的文件列表。如果是这样,请将上述命令的输出传送到
xargs rm
以实际删除这些文件,即运行:

ls -r mysql*.dmp|awk 'a[substr($0, 1, match($0,"_[^_]*$"))]++'|xargs rm
解释
对于每个前缀,它保留名称具有最新时间戳的文件,并删除其他文件。在这里,前缀表示文件到最后一个下划线的路径(
substr(<0,1,match($0,“[^]*$”)
)。
ls-r
输出中文件名的排序顺序将每个前缀的最新文件放在较旧文件之前。
a[]++
确保每个前缀的第一个条目不会被打印。
xarg
运行
rm
,并将文件名作为参数导入。

.dmp
前缀不相同之前,表名在不同的文件之间变化?您希望每个表类型都是最新的还是总体逻辑上是最新的?您期望的文件与新的文件根本不接近est,以下文件比您所指向的文件早
/mysql\u foo\u bar\u hostname\u table 7\u mysql\u dump\u 20160927133419.dmp./mysql\u foo\u bar\u hostname\u table 3\u mysql\u dump\u 20160927121703.dmp./mysql\u foo\u bar\u hostname\u table 2\u mysql\u dump\u 20160927121555.dmp
我已经编辑了我的原始问题。@Ed mortinian,基本上是每表最新的。@Ed Morton、 我糟糕的格式把我举的例子搞砸了。
ls -r mysql*.dmp|awk 'a[substr($0, 1, match($0,"_[^_]*$"))]++'|xargs rm