Список файлов, не соответствующих заданной строке в имени файла

16

У меня есть каталог, в котором создается множество файлов (около 200) с именем temp_log.$$и несколькими другими важными файлами, которые мне нужно проверить.

Как я могу легко перечислить все файлы и исключить их temp_log.$$отображение?

Ожидаемый результат

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

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

Благодарность

холодный морской тропический воздух
источник
в BASH, ls --hide='temp_log.$$'должно работать. Вы можете / должны также расширить это с помощью подстановочных знаков, в зависимости от того, какая часть целого термина temp_log.$$.
erch

Ответы:

25

С GNU ls(версия для не встроенных Linux и Cygwin, иногда также встречающаяся в другом месте), вы можете исключить некоторые файлы при выводе каталога.

ls -I 'temp_log.*' -lrt

(обратите внимание на длинную форму -IIS --ignore='temp_log.*')

С zsh вы можете позволить оболочке выполнять фильтрацию. Перейдите -dк lsтак, чтобы избежать перечисления содержимого совпавших каталогов.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

С ksh, bash или zsh вы можете использовать синтаксис фильтрации ksh. В zsh запускай setopt ksh_globпервым. В bash беги shopt -s extglobпервым.

ls -dltr !(temp_log.*)
Жиль "ТАК - прекрати быть злым"
источник
Пожалуйста, не используйте одинарные кавычки в примере для GNU ls: ls -I 'temp_log. *' -Lrt Они необходимы для передачи шаблона в команду и не позволяют оболочке расширять его.
Shargors
На Ubuntu bash v4.3.48 он должен быть -Itemp_log.*без пробела после-I
Ян Кинг Инь
1
@YanKingYin Нет, хорошо иметь пробел после -I. Тем не менее, *необходимо процитировать так или иначе. -I temp_log.*не работает , но -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*и т.д. все в порядке.
Жиль "ТАК - перестань быть злым"
10

Вы можете использовать grepс опцией -v.

ls -lrt | grep -v <exclude-filename-part>
Андраде
источник
1
не уверен, почему это было отклонено, это правильный ответ.
Тим Кеннеди
5
Выполнение grep для вывода ls не всегда правильно и не рекомендуется. У него есть побочные эффекты. Не в состоянии вспомнить точные проблемы. Дополнительное примечание - голосование вниз было не от меня;)
MTK
1
Вот ссылка на то, почему парсинг ls - плохая идея .
MTK
3

Вы можете использовать findдля этого:

find . \! -name 'temp_log*'

Это просто напечатает имена, которые вы можете добавить, -lsчтобы создать ls -lвывод стиля с отметкой времени и разрешениями, или использовать -exec ls {} +для фактического перехода к ls с любыми параметрами, которые вы хотите для столбцов, сортировки и т. Д.

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

find . \! -name 'temp_log*' -maxdepth 1

И если вы используете ls, вы захотите передать опцию -d, чтобы она не отображалась в каталогах:-exec ls -d {} +

Random832
источник
Вероятно, хотите, чтобы -maxdepth 1также подражать нерекурсивным ls.
jw013
Ницца. Пользователи, которые имеют более минимальный POSIX findбез, -maxdepth должны смотреть здесь .
Wildcard
2

Я думаю, что вы хотите использовать функцию оболочки, а не из ls. Я использую Bash, поэтому я проверил, что вы хотите в man bash. Найдите «^ EXPANSION», (сначала нажав «/»). Выдержка:

РАСШИРЕНИЕ

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

   ︙
... <snip> ...
   ︙

Расширение пути

    После слов расщепления, если -f параметр не установлен, Баш сканирует каждое слово для символов *, ?и [. Если появляется один из этих символов, слово считается шаблоном и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону. ...

Недавно я начал исключать файлы на основе их первой буквы с помощью команды вроде:

$ ls ./[^t]*

Это будет соответствовать всему, что не начинается с буквы t. Если вы добавите больше символов в скобки, то вы исключите файлы, начинающиеся с этих букв.

Ищу ссылку, а у меня хорошая! Смотрите Pattern Matching . Оттуда это будет работать для вашего случая:

$ ls -lrt ./!(temp_log.*)

Для этого необходимо, чтобы extglobопция оболочки была включена с помощью shoptвстроенной функции ( shopt -s extglob), как указано Жилем .

Алекс Лич
источник
-1

Просто сделать

ls -ltr `grep -il patterntosearch  *`
user43658
источник
grepищет шаблон в файле, а не в имени файла.
evilsoup
-2

Поскольку файлы, которые вы НЕ хотите печатать, имеют "temp_log". в имени файла, затем отфильтруйте с помощью grep:

ls -lrt | grep -v "temp_log."

ПРИМЕЧАНИЕ. В другом посте с аналогичным ответом, вероятно, было отказано в голосовании, поскольку пользователь не включал кавычки "" в строку, которую должен искать grep. Без кавычек это не работает как рекламируется.

user185160
источник
Ваше «ПРИМЕЧАНИЕ» не совсем правильно. Есть определенные символы, которые, возможно, нужно заключить в кавычки, но я не думаю, что они есть в этой конкретной строке.
курит 2345
пока не появится пользователь или группа с именем "temp_log" (точка в регулярном выражении будет соответствовать пробелу или чему-либо следующему temp_log. Это не хороший (общий) способ исключить lsрезультаты.
Джефф Шаллер
только с -F@ smokes2345; точка будет соответствовать любому символу в основном регулярном выражении. См .: unix.stackexchange.com/q/119905/117549
Джефф Шаллер