为ls创建别名,使其不显示模式*〜的文件

时间:2011-11-05 19:55:21

标签: bash grep alias ls

是否有一系列命令可以删除备份文件?我想做像

这样的事情
ls | grep -v *~

但是这显示了不同行中的所有文件,任何一个使输出与ls相同的文件?

当我输入" man ls"我的ls手册页有-B的选项

   -B      Force printing of non-printable characters (as defined by ctype(3)
           and current locale settings) in file names as \xxx, where xxx is the
           numeric value of the character in octal.

它与你展示的那个不同,我搜索了忽略但没有弹出结果。顺便说一下,我在Mac上,可能有不同版本的ls?

或者,我可以告诉目录停止制作备份文件吗?

3 个答案:

答案 0 :(得分:9)

假设来自GNU coreutils的ls

       -B, --ignore-backups
              do not list implied entries ending with ~

您还可以在Bash中设置FIGNORE='~',以便*永远不会扩展为包含以~结尾的文件名。

答案 1 :(得分:3)

您可以列出以~结尾的所有文件:

ls -d *[^~]

*[^~]指定所有未以~结尾的文件。 -d标志告诉ls不要显示它匹配的任何目录的目录内容(与默认的ls命令一样)。

修改:如果您将ls设为别名以使用上述命令,则会违反标准ls用法,因此如果您使用ephemient的解决方案,最好希望您的ls用法始终排除备份文件。

答案 2 :(得分:0)

对于被迫使用ls并且没有-B的人(例如,在Mac OS X中使用BSD ls),您可以为基于bash函数的bash函数创建别名Mansoor Siddiqui的建议。如果您将以下函数添加到bash配置文件中,其中保留了别名(.bash_profile.profile.bashrc.bash_aliases或等效内容:

ls_no_hidden() {
  nonflagcount=0
  ARG_ARRAY=(${@})
  flags="-l"
  curdir=`pwd`
  shopt -s nullglob
  # Iterate through args, find all flags (arg starting with dash (-))
  for (( i = 0; i < $# ; i++ )); do
    if [[ ${ARG_ARRAY[${i}]} == -* ]]; then
      flags="${flags} ${ARG_ARRAY[${i}]}";
    else
      ((nonflagcount++));
    fi
  done

  if [[ $nonflagcount -eq 0 ]]; then
    # ls current directory if no non-flag args provided
    FILES=`echo *[^~#]` 
    # check if files are present, before calling ls 
    # to suppress errors if no matches.
    if [[ -n $FILES ]]; then
      ls $flags -d *[^~#]
    fi
  else
    # loop through all args, and run ls for each non-flag
    for (( i = 0; i < $# ; i++ )); do
      if [[ ${ARG_ARRAY[${i}]} != -* ]]; then
        # if directory, enter the directory
        if [[ -d ${ARG_ARRAY[${i}]} ]]; then
          cd ${ARG_ARRAY[${i}]}
          # check that the cd was successful before calling ls
          if [[ $? -eq 0 ]]; then
            pwd # print directory you are listing (feel free to comment out)
            FILES=`echo *[^~#]`
            if [[ -n $FILES ]]; then
              ls $flags -d *[^~#]
            fi
            cd $curdir
          fi
        else
          # if file list the file
          if [[ -f ${ARG_ARRAY[${i}]} ]]; then
            ls $flags ${ARG_ARRAY[${i}]}
          else
            echo "Directory/File not found: ${ARG_ARRAY[${i}]}"
          fi
        fi
      fi
    done
  fi
}
alias l=ls_no_hidden

然后l将映射到ls,但不会显示以~#结尾的文件。