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

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

我的要求是列出目录中的所有文件,除了以 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 或更多,有时更多)

相关内容