我有一个 bash 脚本,它在 AIX 中保留最后 5 个副本,如下所示:
rm `ls -lt /path/the_file_* | tail -n +6`
但我收到这个错误:
rm: Not a recognized flag: w
更新
该ls
命令返回以下内容:
-rw-r--r-- 1 user group1 14 Mar 11 09:54 the_file_20130311.bz2
这有什么线索吗?
答案1
你说的本质上是
rm -rw-r--r-- 1 user group1 14 Mar 11 09:54 the_file_20130311.bz2
换句话说。递归删除名为:
1
user
group1
14
Mar
...
如果有一个-w
rm 标志和其他奇怪的事情-rw-r--r--
更好的选择可能是使用ls -t
.不用担心它不在单独的行上,因为可以ls
检测它的输出是否到 tty。
通过例如演示:
ls -t | cat
但另一个问题出现了,那就是你不在正确的目录中。所以你所说的实际上是删除当前目录中的文件,该文件的名称与/path/
.
因此,首先确保您处于正确的路径,或者,如果您可以find
在系统上安装 GNU,则另一个选择将是以下方向:
find /path/to/files -maxdepth 1 -type f -name 'the_file_*' -printf '%T@ %p\n' |
sort -nr | head -n6 | cut -f2- -d" "
请注意,您需要完整路径才能获得正确的列表。
然后;如果看起来不错,请将其添加到rm
例程中。
答案2
命令返回什么ls ...
?请记住,该命令已运行,并且输出作为参数给出rm
。没有什么可以使输出成为“文件名”。如果-w
那里确实应该有一个文件,也许--
AIX 上有结束标志,它应该是rm -- ...
更新:
哦,脑子进水了。不仅会ls -l
给出文件名,还会给出权限,例如-rw...
,并且(如上所述)rm
将其作为标志。你应该做:
rm `ls -t /path/the_file_* | tail -n +6`
有些命令(这是许多其他命令已经采用的 GNU 约定)的--
意思是“标志在此结束”。因此,要删除一个名为 的文件,-rf
您可以这样做rm -- -rf
,一般来说,您可以说不拾取虚假标志cmd -flags -x -y -- anything goes here
。