Избегайте перечисления файлов, которые заканчиваются ~ (резервные файлы)

Конечно. Применяйте философию Unix: комбинируйте инструменты вместе.

</dev/zero tr '\0' 'a'
20
01.10.2018, 21:25
7 ответов

Реализация GNU ls(, найденная в большинстве систем Linux, )имеет опцию для этого:-BИгнорировать резервные копии:

ls --ignore-backups
51
27.01.2020, 19:43
ls -l | grep -v ~

Причина, по которой это не работает, заключается в том, что тильда расширяется до вашего домашнего каталога, поэтому grepникогда не видит буквальную тильду. (См., например,. Руководство Bash по Tilde Expansion . )Вам нужно заключить его в кавычки, чтобы предотвратить расширение, т.е.

ls -l | grep -v "~"

Конечно, это по-прежнему удалит любые строки вывода с тильдой в любом месте, даже в середине имени файла или в другом месте lsвывода (, хотя вряд ли это появится в именах пользователей, датах и ​​т. д. ). Если вы действительно хотите игнорировать только файлы, которые заканчиваются тильдой, вы можете использовать

ls -l | grep -v "~$"
50
27.01.2020, 19:43

Если вы используете bash, убедитесь, что extglobвключен:

shopt -s extglob

Затем вы можете использовать:

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

В zsh вы можете сделать то же самое с опцией kshglobили с помощью собственных расширенных глобусов:

setopt extended_glob
ls -d -- ^*~

Поскольку исключаемый суффикс состоит только из одного символа, вы также можете сопоставлять имена файлов, в которых последний символ не является тильдой (это должно работать и без extglob):

ls -d -- *[^~]

Но общая идея заключается в использовании ls --ignore-backups.

24
27.01.2020, 19:43

Это должно помочь:

ls -l | grep -v '~'  

Причина :Символ ~заменяется вашим домашним каталогом перед выполнением команды. Попробуйте

echo ~

и

echo '~'
12
27.01.2020, 19:43

Как упоминалось в других ответах, причина, по которой у вас, вероятно, возникают проблемы, заключается в том, что вы не использовали тильду в кавычках или не экранировали ее.

В одном конкретном случае я использовал расширение имени файла оболочки, чтобы сделать что-то подобное. Я использую его примерно с 2003 года, что означает, что он работал с очень широким спектром реализаций оболочки в различных типах систем. (здесь я также использую -C, потому что хочу красиво отображать отсортированные столбцы)

ls -C *[!~]

(ограничение при использовании расширения имени файла оболочки, конечно же, заключается в том, что каталог с очень большим количеством (не -файлов резервных копий )приведет к тому, что расширение превысит доступный размер списка аргументов, хотя на большинстве современных систем этот предел довольно высок, часто 250 КБ или больше, иногда намного больше)

6
27.01.2020, 19:43

ls | grep -v '~$'— это быстрое решение. Он использует ls для перечисления всех (не-скрытых )файлов, затем использует grep с-v(инвертированным соответствием, т. е. исключение )для исключения всех строк с тильдой(~)в конце ($). ].

ОДНАКО, если у вас есть ЛЮБЫЕ файлы с именами типа something1, something2, это ОГРОМНЫЙ вонючий показатель того, что у вас плохой рабочий процесс, который вы должны исправить в источнике, а не с помощью неуклюжих хаков, таких как изменение того, как работает ls.

Если вы обнаружите, что называете файлы номерами версий, например, test1 и test2 или testone и testtwo, то вам действительно нужна система контроля версий, например git.

Это особенно верно в вашем случае, когда у вас есть несколько версий нескольких файлов, и кажется, что управление версиями должно быть скоординировано между всеми файлами.

Системы контроля версий позволяют по существу накладывать временное окно на файловую систему, так что вы видите только один testфайл, но под капотом (через программу контроля версий )все версии доступны для поиска, извлекать, возвращаться, сравнивать с и т. д.

После того, как вы настроите эту настройку, вам больше не понадобятся файлы резервных копий из вашего редактора, потому что система управления версиями хранит историю файлов с тех пор, как вы начали ее использовать, даже если с тех пор вы внесли тысячу изменений. Вы даже можете «разветвить» временную шкалу истории, опробовав новую идею и вернувшись назад во времени, а затем вперед, чтобы попробовать другую идею, если вам нужно.

1
27.01.2020, 19:43

Хотя многие ответы верны (Мне нравится @Foonв частности ), я бы отметил, что получение списка имен с помощью ls -lнемного неубедительно по разным причинам.

Неудивительно, что правильным инструментом для поиска файлов является find.

Одним из его результатов является то, что он может обрабатывать «логику выбора». сам по себе, например:

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

, что буквально означает от findдо:

  1. Поиск файлов в текущем каталоге:.
  2. Ищите их только на уровне этого каталога, то есть не рекурсивно:-maxdepth 1
  3. Там ищите сущности, которые

    • типа файл:-type f
    • и:-a
    • чьи имена не заканчиваются на~:! -name *~(где !отменяет следующую директиву что совпадает с именами файлов,-name *~).

    (Чтобы все совпадения по типу и имени отображались как логическая единица, заключенная в скобки (и)).

  4. Печатать имя каждого найденного файла:-print.

Вам необходимо защитить некоторые символы, которые являются особыми для shell от интерпретации оболочкой, и поэтому круглые скобки и челка, !, экранированы обратной косой чертой -, а шаблон имени *~заключен в одинарные кавычки.

Команда findобладает очень мощным мини-языком -благодаря использованию своих опций. Например, можно указать рекурсивно обрабатывать все дерево файловой системы (или деревья ), но пропустить определенные каталоги во время сканирования.Можно сопоставить несколько атрибутов файлов, таких как создание или изменение время или размер чего бы то ни было.

1
27.01.2020, 19:43

Теги

Похожие вопросы