如何删除被awk过滤掉的文件

Eug*_*e S 4 find xargs awk

我在一个目录中有以下文件:

-rw-r--r-- 1 smsc sys  46 Apr 22 12:09 bills.50.1.3G.MO.X.20120422120453.Z
-rw-r--r-- 1 smsc sys  28 Apr 22 12:15 bills.50.1.3G.MO.X.20120422120953.Z
-rw-r--r-- 1 smsc sys  46 Apr 22 12:20 bills.50.1.3G.MO.X.20120422121453.Z
-rw-r--r-- 1 smsc sys  46 Apr 22 12:25 bills.50.1.3G.MO.X.20120422121953.Z
Run Code Online (Sandbox Code Playgroud)

其中第五列是文件的大小。我想删除所有大小为 46 的文件。为了过滤掉这些文件,我使用了以下命令:

ls -ltr | awk '$5 ~ /46/ {print $0}'
Run Code Online (Sandbox Code Playgroud)

哪个工作正常。但是现在我想删除所有被过滤掉的文件,所以我在上面的命令中添加了以下内容:

ls -ltr | awk '$5 ~ /46/ {print $0}' | xargs rm
Run Code Online (Sandbox Code Playgroud)

但是它给了我以下错误:

rm: invalid option -- w
Run Code Online (Sandbox Code Playgroud)

似乎我必须使用findoverls所以我将获得以下格式的输出:

./bills.50.1.3G.MO.X.20120421050453.Z
./bills.50.1.3G.MO.X.20120421154953.Z
./bills.50.1.3G.MO.X.20120419133452.Z
Run Code Online (Sandbox Code Playgroud)

但是我无法通过其参数过滤文件。如何完成这项任务?

gee*_*aur 12

你有两个错误:

  1. 您正在比较包含 的大小46;你希望它等于46。

  2. 当您只需要文件名时,您正在打印整行。

还有一个问题:当您不使用排序顺序时-ltr,对ls输出进行排序有什么意义?

你想做类似的事情

ls -l | awk '$5 == "46" {print $9}' | xargs rm
Run Code Online (Sandbox Code Playgroud)

除非你希望这样做,因为虽然它可能是目前安全,解析ls输出是不可靠的。使用适当的工具,例如

find . -maxdepth 1 -size 46c -delete # requires GNU find
Run Code Online (Sandbox Code Playgroud)

(这样做可移植更烦人,因为 POSIXfind没有-maxdepth-size在块以外的单元中运行。最好在 Perl/Python/Ruby/等中编写脚本,可以使用正确的目录扫描,不会得到文件名中的特殊字符有问题。)

  • 还要注意上面关于解析`ls`输出的评论,我让通过了;由于文件名中可能包含空格和其他特殊字符,这确实不是一个好主意。 (2认同)