Как перечислить файлы без каталогов и фильтр по имени (ls опции)

Мой друг послал мне по электронной почте это:

Это - часть библиотеки истории GNU. В ударе это используется, чтобы повторно выполнить команды в Вашей истории. Если Вы хотите быть хардкором, grep для history_expansion_char в bash-4.1/lib/readline/histexpand.c для деталей реализации.

43
01.07.2011, 20:15
9 ответов

Это походит на задание для find.

  • Использовать -maxdepth чтобы только возвратить текущий каталог не, recursivly ищут в подпапках
  • Использовать -type f только возвратить файлы и не каталоги или узлы устройства или безотносительно
  • Используйте комбинацию если -not и -name для предотвращения файлов с именами, Вы не хотите

Это могло бы объединиться как это:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
54
27.01.2020, 19:35
  • 1
    Спасибо! я довольно плохо знаком с CLI и никогда не использовал, находят прежде. Я определенно далее изучу его. –  EmmyS 01.07.2011, 20:50
  • 2
    @EmmyS: Вы могли бы найти еще один небольшой прием полезным здесь. @Gilles упомянул, что использовал -exec ls -lG -- {} + в его ответе для получения вывода с помощью дополнительных опций для ls. Можно также добавить просто -ls к этой находке для получения быстрого и грязного приближения подробного представления ls. –  Caleb 02.07.2011, 12:12

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

ls --hide='t_*' uploads

Другой подход должен заставить Вашу оболочку сделать соответствие. Bash, ksh и zsh имеют шаблон отрицания !(t_*) соответствовать всем файлам кроме тех, которые соответствуют t*; в ударе эта функция должна быть включена с shopt -s extglob, и в zsh это должно быть включено с setopt ksh_glob. Zsh также имеет эквивалентный синтаксис ^t_* который должен быть включен с setopt extended_glob. Это все еще не игнорирует каталоги. Zsh имеет дополнительную функцию, которая позволяет соответствовать файлам не только по имени, но также и метаданными и больше: спецификаторы шарика. Добавить (.) в конце соответствия для ограничения регулярными файлами. Отрицание ^ часть синтаксиса соответствия имени, таким образом, ^t_*(.) означает “все регулярные файлы, не соответствующие t_*” и не “все файлы, которые не являются регулярным соответствием файлов t_*”.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

При нахождении без усовершенствованных инструментов можно сделать это на любом Unix с find. Это не вид вещи, которую Вы обычно вводили бы на командной строке, но это мощно и точно. Caleb уже показал, как сделать, это с GNU находит. -maxdepth опция не является портативной; можно использовать -prune вместо этого, для портативной остановки find от рекурсивного вызова.

find uploads/* -type d -prune -o \! -type f -name 't_*' -print

Замена -print -exec ls -lG -- {} + выполниться ls с Вашими любимыми опциями на файлах.

Все команды выше скрывают точечные файлы (т.е. файлы, имя которых начинается с a .). Если Вы хотите отобразить их, передачу -A кому: ls, или добавьте D спецификатор шарика в zsh (ls uploads/^t_*(.D)). С find, можно использовать другой подход того, чтобы заставлять это рекурсивно вызвать один уровень только (find не рассматривает точечные файлы особенно). Это только полностью работает, если Вы работаете find в текущем каталоге.

cd uploads && find . -name . -o -type d -prune -o \! -type f -name 't_*' -print
18
27.01.2020, 19:35
  • 1
    У Вас есть dayjob?;-) Я постоянно поражаюсь длиной и уровнем деталей Ваших ответов, даже к самое просто выглядящим вопросам здесь в Unix SE!.. Продолжите это так или иначе! :) –  alex 01.07.2011, 22:01
  • 2
    Спасибо! Большая деталь. Я не знаю, "усовершенствовал ли я инструменты" или не прямо сейчас; я нахожусь на Mac на работе (хотя Linux дома, таким образом, я уверен, что это пригодится в какой-то момент.) –  EmmyS 01.07.2011, 22:30
  • 3
    @EmmyS: Поскольку Ваш Linux упаковывает мое использование -maxdepth должен работать, но проблема "мобильности", к которой обращается Gilles, состоит в том что BSD find (также найденный на OSX я думаю), немного другое животное, таким образом, Вам, возможно, понадобился бы его ответ также. @Gilles: +1 для приема zsh! –  Caleb 01.07.2011, 22:54
  • 4
    @Gilles: Некоторые не так сочные комментарии о prunes приходят на ум, но я позволю ему пройти, просто говоря, что, когда я небрежно обращаюсь в своих собственных системах с количеством раз, мысль "была бы эта команда работать, если я был на AIX, Солярис или MINIX3" являются приблизительно... резервным устройством... Мне нелегко получать показание... дисплей замораживается с 0.00. –  Caleb 02.07.2011, 12:17
  • 5
    Не Делает Гну ls имейте a --use-telepathy опция? Это - самый быстрый способ отобразить просто файлы, которые Вы хотите. Это не могло бы быть портативно все же. –  dubiousjim 17.10.2012, 21:20
ls -l /folder | grep ^- | awk '{print $9}'
10
27.01.2020, 19:35

Позвольте мне дать ему использование выстрела ls и каналы:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

скажите, что последний столбец является 9-м.

0
27.01.2020, 19:35
  • 1
    Что, если существуют файлы с пробелами? –  jordanm 17.10.2012, 20:52

Если-maxdepth проблемой мобильности находки является беспокойство, Вы могли бы использовать:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Я не эксперт, но я думаю, что это должно работать. Я предполагаю, что это выглядит немного загадочным, но если Вы говорите awk, это действительно нет. $NF мог использоваться вместо 9$. Вы могли также сделать:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

который делает то же самое (но возможно менее эффективно, чем первый???).

На самом деле, после размышления о других сообщениях, это похоже

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

еще более короткий и более ясный путь.

Кто-то исправьте меня, если я неправ.:-)

0
27.01.2020, 19:35
  • 1
    Парсинг ls обычно не хорошая идея. Ваши приемы awk перестанут работать с именами файлов с пробелом в них, например. яркий пример –  Mat 23.06.2013, 21:53
  • 2
    @mat - Спасибо за исправление. После чтения статьи, что Вы (и jw013) указанный, я вижу, что ls не может быть доверен для вывода корректных имен файлов. Даже если я должен был переписать код awk для печати всего от 9$ в конец строки (для включения пробелов), этот вывод ls может все еще быть ошибочным. Это неутешительно и должно быть исправлено IMO. Еще раз спасибо. –  kkaszub 24.06.2013, 06:37

Я нашел эти короткие пути:

ls -p uploads | grep -Ev '/'

или

ls -pIt_* uploads | grep -v /
0
27.01.2020, 19:35

Если вы используете lightdm для ведения журнала, но у вас нет GUI, вы можете запустить следующее:

sudo nano /etc/lightdm/lightdm.conf

Вы увидите строку autologin-user = username , вы можете прокомментировать ее с помощью # или просто удалить инструкцию username .

После этого в командной строке запустите sudo service lightdm restart или просто перезапустите компьютер.

-121--71835-

В этом случае полное отключение раздела подкачки является хорошей идеей?

Да, вы можете перенести подкачки с жесткого диска/SDD в оперативную память. Последние ядра Linux включают модуль ZRAM внутри, поэтому вы можете использовать своп в ОЗУ. Это значительно повысит скорость операций замены, но в некоторых случаях увеличит загрузку ЦП.

Вы можете прочитать об этом на https://wiki.debian.org/ZRam

-121--108708-
ls -l | grep -v ^d | grep name$
1
27.01.2020, 19:35

Попробуйте использовать этот псевдоним:

alias l='ls -hLlF'
-1
27.01.2020, 19:35

Легкий пирог:

ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d

-1
27.01.2020, 19:35

Теги

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