我想删除具有特定模式的线条。
-rw-rw-r-- 1 user1 user1 10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw------- 1 user1 user1 0 Oct 27 11:17 ./folder1/folder2/.test-file1-228783-cause1-XY-OP-0001.pdf.lyWfRr
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw------- 1 user1 user1 0 Oct 27 11:19 ./folder1/folder2/.test-file3-228706-cause1-XY-OP-0005.pdf.GftyJL
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf
从上面的行集中,想要删除下面的行
-rw------- 1 user1 user1 0 Oct 27 11:17 ./folder1/folder2/.test-file1-228783-cause1-XY-OP-0001.pdf.lyWfRr
-rw------- 1 user1 user1 0 Oct 27 11:19 ./folder1/folder2/.test-file3-228706-cause1-XY-OP-0005.pdf.GftyJL
你能告诉我怎么做吗?
谢谢
答案1
我假设此文本存储在一个文件中,比如说ls_l_out.txt
。
我不知道您希望如何完成模式匹配,但我认为最简单的事情就是匹配权限。
因此,考虑到这一点,您可以使用这个 sed 命令:
$ sed '/^-rw-------/d' ls_l_out.txt
-rw-rw-r-- 1 user1 user1 10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf
如果您运行该程序并且输出看起来不错,那么您可以使用 sed 标志来就地编辑该文件-i
:
$ sed -i '/^-rw-------/d' ls_l_out.txt
答案2
从您的输出可以看出您运行了命令
$ ls -la ./folder1/folder2/
或类似的东西,你的问题要求解析的输出ls
。然而,你真的不应该解析 ls,因为出于多种原因,这种做法很糟糕。更好的方法是这样的:
$ ls ./folder1/folder2/{"",.}test*pdf
路径名扩展将仅抓取以 开头test
和结尾的文件pdf
,这些文件可能以点开头,也可能不以点开头。以 结尾的文件 lyWfRr
不会GftyJL
以这种方式显示。
但是,如果你坚持要解析该输出,请使用$
anchor inawk
过滤掉仅以.pdf
$ awk '/pdf$/' input.txt
-rw-rw-r-- 1 user1 user1 10 Oct 27 10:08 ./folder1/folder2/test-file1-228783-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:12 ./folder1/folder2/test-file2-228651-cause1-XY-OP-0001.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:08 ./folder1/folder2/test-file3-228706-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file4-228695-cause1-XY-OP-0005.pdf
-rw-rw-r-- 1 user1 user1 20 Oct 27 10:15 ./folder1/folder2/test-file5-228675-cause1-XY-OP-0001.pdf
需要说明的是,我并不赞同这种做法,我鼓励用户避免ls
解析,并以正确的方式做事TM
答案3
虽然当前的答案是有效的,但是如果您要处理大量文件(超过 30k),它们可能会有问题。在这种情况下,我建议改用 find:
find ./folder1/folder2 -maxdepth 0 -type f -name ".test-file*-*-cause1-XY-OP-*.pdf.*" -delete
编辑:我假设您想删除文件而不是更新文件的内容。在这种情况下,使用 sed、awk 或 grep 是唯一的选择,因此您应该避免这个答案。