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


20

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

我试图使用命令:

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

看来您正在尝试避免列出以结尾的文件~。这些文件是一些文本编辑器创建的备份文件。
ctrl-alt-delor

您使用的是哪个操作系统:是Gnu / Linux(例如Debian,Ubuntu,Redhat,Centos,Fedora,Suse,Mint,Arch等)吗?
ctrl-alt-delor

2
请注意,您要忽略的文件似乎是Emacs备份文件。更改Emacs的行为非常容易,因此可以将备份保存在集中目录中,而不是整个地方。参见emacs.stackexchange.com/questions/33/…–凯莉安·佛斯
Kilian Foth)'18

很抱歉,我很卑鄙,但我不相信您。ls -l(字母ell)将包括列出的每个文件的权限,nlinks,所有者,大小和modtime。产生您显示的输出的是ls -1(第一位),并且在许多系统上-1都需要在终端上产生单列输出,但是不需要通过ls管道传输(如此处grep)或重定向时-1,它已经是单列。
dave_thompson_085 '18

@ dave_thompson_085我已将所有文本都截断了,并且只在这里删除了文件名。.因为我觉得这无关紧要。这也是一个生产系统(不是我自己的系统)。所以我不想列出用户名,详细信息并泄漏它们。
curious_one 18-10-10

Answers:


49
ls -l | grep -v ~

这不起作用的原因是波浪号已扩展到您的主目录,因此grep永远不会看到文字波浪号。(例如,请参见Bash关于Tilde Expansion的手册。)您需要引用它以防止扩展,即

ls -l | grep -v "~"

当然,即使在文件名中间或ls输出中的其他位置,这仍将删除任何带有波浪号的输出行(尽管它不太可能出现在用户名,日期等中)。如果您确实只想忽略以波浪号结尾的文件,则可以使用

ls -l | grep -v "~$"

48

GNU的实现ls(在大多数Linux系统上都可以找到)具有以下选项:-B忽略备份:

ls --ignore-backups

24

如果您使用的是bash,请确保extglob已启用:

shopt -s extglob

然后,您可以使用:

ls -d -- !(*~)
  • -d 不显示目录内容
  • !(*~) 除以结尾的文件外的所有文件 ~

在zsh上,您可以使用该kshglob选项或使用其自身的扩展glob进行相同操作:

setopt extended_glob
ls -d -- ^*~

由于要排除的后缀只有一个字符长,因此您也可以匹配最后一个字符不是波浪号的文件名(这也可以在没有的情况下使用extglob):

ls -d -- *[^~]

但是一般的想法是使用ls --ignore-backups



6

如其他答复中所述,您可能遇到问题的原因是因为您未引用或转义代字号。

对于一个特定的用例,我使用了shell文件名扩展来做类似的事情。自2003年左右以来,我一直在使用它,这意味着它已经在不同类型的系统上用于多种Shell实现。(在这里我也使用它,-C因为我希望在排序的列中显示一个漂亮的)

ls -C *[!~]

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


1

ls | grep -v '~$'是快速的解决方案。它使用ls列出所有(非隐藏的)文件,然后使用grep with -v(反向匹配,即排除)来排除所有以波浪号(~)结尾的行$

但是,如果您有任何命名为something1,something2的文件,则这是一个巨大的臭味,表明您的工作流程很糟糕,应该从源头上修复它,而不要像修改ls的工作这样的笨拙的hacks。

如果您发现自己用版本号命名文件,例如test1和test2或testone和testtwo,那么您真正想要的是一个版本控制系统,例如git

在您具有多个文件的多个版本的情况下,尤其是这样,并且似乎需要在所有文件之间协调版本控制。

版本控制系统实际上使您可以在文件系统上覆盖一个时间窗口,因此您只能看到一个test文件,但是在内部(通过版本控制程序),可以使用所有版本进行搜索,检索,还原,比较等。 。

设置完成后,您将不再需要编辑器中的备份文件,因为版本控制具有自您开始使用以来的文件历史记录,即使此后进行了千次更改。您甚至可以“分支”历史时间表,尝试一个新的想法,然后根据需要返回过去,然后继续尝试另一个想法。


1

尽管许多答案是正确的(我特别喜欢的答案@Foon),但我要指出,ls -l由于各种原因,获取带有名称的列表有点la脚。

毫无疑问,查找文件的合适工具是find

其优势之一是它能够自行处理“选择逻辑”,例如:

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

从字面上说find

  1. 在当前目录中查找文件: .
  2. 仅在该目录级别上查找它们,即不要递归: -maxdepth 1
  3. 在那寻找实体,

    • 类型文件: -type f
    • 和: -a
    • 其名称不以~:结尾! -name *~ (其中!否定了与文件名匹配的以下伪指令-name *~)。

    (要使类型和名称的整体匹配显示为逻辑单元,请在(和后面加上括号))。

  4. 打印找到的每个文件的名称:-print

您需要保护一些特殊于外壳的字符,以免被外壳解释,这就是为什么括号和bang !都用反斜杠转义,而名称模式*~则用单引号引起来。

find命令通过使用其选项具有非常强大的迷你语言。例如,可能被告知要递归处理整个文件系统树,但在扫描时忽略某些目录。可以匹配文件的多个属性,例如创建或修改时间或大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.