我的要求是列出目录中的所有文件,除了以 a 结尾的文件~
(备份文件)。
我尝试使用命令:
ls -l | grep -v ~
我得到这个输出:
asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~
我只想获取这些文件:
asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt
答案1
GNU 实现ls
(在大多数 Linux 系统上都有)有一个选项:-B
忽略备份:
ls --ignore-backups
答案2
ls -l | grep -v ~
这不起作用的原因是波形符会扩展到您的主目录,因此grep
永远不会看到字面的波形符。 (参见例如Bash 关于波浪号扩展的手册.)你需要引用它以防止扩展,即
ls -l | grep -v "~"
当然,这仍然会删除任何带有波形符的输出行,即使是在文件名中间或输出中的其他位置ls
(尽管它可能不太可能出现在用户名、日期等中)。如果您确实只想忽略以波浪号结尾的文件,您可以使用
ls -l | grep -v "~$"
答案3
如果您使用的是 bash,请确保extglob
已启用:
shopt -s extglob
然后你可以使用:
ls -d -- !(*~)
-d
不显示目录的内容!(*~)
除了以以下结尾的所有文件~
kshglob
在 zsh 上,您可以使用该选项或使用其自己的扩展 glob执行相同的操作:
setopt extended_glob
ls -d -- ^*~
由于要排除的后缀只有一个字符长,因此您还可以匹配最后一个字符不是波形符的文件名(这extglob
也应该在没有 的情况下工作):
ls -d -- *[^~]
但总体思路是使用ls --ignore-backups
.
答案4
正如其他回复中提到的,您可能遇到问题的原因是您没有引用或转义波浪号。
对于一个特定的用例,我使用 shell 文件名扩展来执行类似的操作。我从 2003 年左右就开始使用它,这意味着它适用于不同类型系统上的各种 shell 实现。 (这里我也使用,-C
因为我希望在排序的列中有一个很好的显示)
ls -C *[!~]
(当然,使用 shell 文件名扩展的一个限制是,具有大量(非备份)文件的目录将导致扩展超出可用参数列表大小,尽管在大多数现代系统上,此限制相当高,通常250KB 或更多,有时更多)