сделать псевдоним для ls, чтобы он не отображал файлы шаблона * ~ - PullRequest
1 голос
/ 05 ноября 2011

Есть ли серия команд, которые 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 ]

9 голосов
/ 06 ноября 2011

Предполагая ls из GNU coreutils,

       <b>-B</b>, <b>--ignore-backups</b>
              do not list implied entries ending with ~

Вы также можете установить FIGNORE='~' в Bash, чтобы * никогда не расширялся, чтобы содержать имена файлов, заканчивающиеся ~.

3 голосов
/ 05 ноября 2011

Вы можете перечислить все файлы, заканчивающиеся на ~ с:

ls -d *[^~]

*[^~] указывает все файлы, которые не заканчиваются на ~. Флаг -d указывает ls не показывать содержимое каталога для любых каталогов, которым он соответствует (как с командой ls по умолчанию).

Редактировать: Если вы используете псевдоним ls для использования вышеуказанной команды, это нарушит стандартное использование ls, поэтому вам лучше использовать решение ephemient, если вы хотите ls использование для исключения файлов резервных копий.

0 голосов
/ 28 марта 2014

Для людей, вынужденных использовать ls, у которых нет -B (например, с использованием BSD ls в Mac OS X), вы можете создать псевдоним для функции bash, основанный на предложении Мансура Сиддики.Если вы добавите в свой профиль 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, но не отображать файлы, которые заканчиваются на ~ или #.

...