避免列出以 ~ 结尾的文件(备份文件)

cur*_*one 20 ls filenames

我的要求是列出目录中的所有文件,但以~(备份文件)结尾的文件除外。

我尝试使用命令:

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)


Gre*_*ods 6

正如其他回复中提到的,您可能遇到问题的原因是因为您没有引用或转义波浪号。

对于一个特定的用例,我使用 shell 文件名扩展来做类似的事情。我从 2003 年左右开始使用它,这意味着它已经在不同类型的系统上进行了非常广泛的 shell 实现。(这里我也使用,-C因为我想在排序的列中很好地显示)

ls -C *[!~]
Run Code Online (Sandbox Code Playgroud)

(当然,使用 shell 文件名扩展的一个限制是具有大量(非备份)文件的目录将导致扩展超过可用参数列表大小,尽管在大多数现代系统上这个限制相当高,通常250KB 或更多,有时更多)