我的要求是列出目录中的所有文件,但以~(备份文件)结尾的文件除外。
我尝试使用命令:
ls -l | grep -v ~
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
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~
Run Code Online (Sandbox Code Playgroud)
我只想获取这些文件:
asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt
Run Code Online (Sandbox Code Playgroud)
hsc*_*hou 50
GNU 实现ls(可在大多数 Linux 系统上找到)有一个选项:-B忽略备份:
ls --ignore-backups
Run Code Online (Sandbox Code Playgroud)
ilk*_*chu 49
ls -l | grep -v ~
Run Code Online (Sandbox Code Playgroud)
这不起作用的原因是波浪号被扩展到您的主目录,因此grep永远不会看到文字波浪号。(参见例如Bash 的 Tilde Expansion 手册。)您需要引用它以防止扩展,即
ls -l | grep -v "~"
Run Code Online (Sandbox Code Playgroud)
当然,这仍然会删除任何带有波浪号的输出行,即使在文件名中间或ls输出中的其他地方(尽管它可能不会出现在用户名、日期等中)。如果你真的只想忽略以波浪号结尾的文件,你可以使用
ls -l | grep -v "~$"
Run Code Online (Sandbox Code Playgroud)
Rav*_*ina 24
如果您使用的是 bash,请确保extglob已启用:
shopt -s extglob
Run Code Online (Sandbox Code Playgroud)
然后你可以使用:
ls -d -- !(*~)
Run Code Online (Sandbox Code Playgroud)
-d 不显示目录的内容!(*~) 除了以 ~在 zsh 上,您可以使用该kshglob选项或使用其自己的扩展 glob执行相同操作:
setopt extended_glob
ls -d -- ^*~
Run Code Online (Sandbox Code Playgroud)
由于要排除的后缀只有一个字符长,您还可以匹配最后一个字符不是波浪号的文件名(这也应该在没有 的情况下工作extglob):
ls -d -- *[^~]
Run Code Online (Sandbox Code Playgroud)
但总体思路是使用ls --ignore-backups.
Nic*_*wey 12
这应该有帮助:
ls -l | grep -v '~'
Run Code Online (Sandbox Code Playgroud)
原因: ~ 字符在命令执行之前被您的主目录替换。尝试
echo ~
Run Code Online (Sandbox Code Playgroud)
和
echo '~'
Run Code Online (Sandbox Code Playgroud)
正如其他回复中提到的,您可能遇到问题的原因是因为您没有引用或转义波浪号。
对于一个特定的用例,我使用 shell 文件名扩展来做类似的事情。我从 2003 年左右开始使用它,这意味着它已经在不同类型的系统上进行了非常广泛的 shell 实现。(这里我也使用,-C因为我想在排序的列中很好地显示)
ls -C *[!~]
Run Code Online (Sandbox Code Playgroud)
(当然,使用 shell 文件名扩展的一个限制是具有大量(非备份)文件的目录将导致扩展超过可用参数列表大小,尽管在大多数现代系统上这个限制相当高,通常250KB 或更多,有时更多)