У меня есть каталог, в котором я хотел бы перечислить все содержимое (файлы и подкаталоги) без отображения символических ссылок. Я использую утилиты GNU в Linux. ls
Версия 8,13.
Пример:
Полный список каталогов:
~/test$ ls -Gg
total 12
drwxrwxr-x 2 4096 Jul 9 10:29 dir1
drwxrwxr-x 2 4096 Jul 9 10:29 dir2
drwxrwxr-x 2 4096 Jul 9 10:29 dir3
-rw-rw-r-- 1 0 Jul 9 10:29 file1
-rw-rw-r-- 1 0 Jul 9 10:29 file2
lrwxrwxrwx 1 5 Jul 9 10:29 link1 -> link1
lrwxrwxrwx 1 5 Jul 9 10:30 link2 -> link2
Что бы я хотел получить
~/test$ ls -somthing (or bash hack)
total 12
dir1 dir2 dir3 file1 file2
ПРИМЕЧАНИЕ. Моя основная мотивация - сделать рекурсивный grep (GNU grep 2.10) без следующих символических ссылок.
grep
(см. Последний абзац).grep -H
, если у вас есть (см.man grep
), Или иным образом,grep 'pat' '{}' /dev/null ';'
чтобы обмануть его, думая, что есть несколько файлов, если у вас его нет.+
не соответствует этому требованию в вырожденном случае, когда в конце остается только один файл или один файл.Или проще:
объяснение
ls -l
означает перечислить в длинной форме . Когда вы делаете это, первая строка символов дает информацию о каждом файле. Первый символ указывает на тип каждого файла. Если это символическая ссылка, тоl
первый символ.grep -v ^l
означает отфильтровывать (-v
) строки, начинающиеся с (^
) anl
.источник
for i in
-l
вls
. Так что это не будет работать, как ожидалось:ls | grep -v ^l
find
, см. Unix.stackexchange.com/questions/321697Начиная с версии 2.12,
-r
опция для GNU grep не разыменовывает символические ссылки, если вы не укажете их вручную:источник
-R, -r, --recursive Read all files under each directory, recursively; this is equivalent to the -d recurse option.
в 2.10В zsh это было бы легко благодаря квалификаторам glob :
Шаблон
**/
рекурсивно пересекает подкаталоги. Спецификатор glob.
ограничивает соответствие обычным файлам.Без zsh используйте
find
(см . Ответ Майкла Хорнера ). И в этом конкретном случае GNU grep может делать то, что вы хотите (это именно то, чтоgrep -r
делает) - но только начиная с версии 2.12, более ранние версии действительно следовали по символическим ссылкам.источник
Вы можете использовать
$LS_COLORS
для этого. Если ваша версияls
поддерживает указание цветов с помощью этой переменной, вы можете определить вывод для каждого типа файла. Это встроенное поведение и очень настраиваемый. Поэтому я создал несколько файлов для демонстрации, например:Так что теперь я сделаю:
И нули тоже есть ...
Вы можете указать для всех или любых типов файлов. Делая это только для одного типа файла, вы, возможно, не захотите, поскольку в
ls
него включены некоторые значения компиляции по умолчанию для экранирования терминала. Вы бы гораздо лучше обращались к API как к единому интерфейсу. Вот простой маленький способ синтаксического анализа и назначения текущихdircolors
настроек среды по умолчанию:Его вывод в мой домашний каталог выглядит так:
Вы можете запустить это
cat -A
тоже, и единственное отличие, с которым вы столкнетесь, это то, что вы увидите$
новые строки - вls --color=always
этой конфигурации нет непечатаемых символов - только то, что вы видите здесь.ls
вставляет свой экранированный терминал по умолчанию следующим образом:... где значения по умолчанию для
$lc
(слева от кода) ,$rc
(справа от кода) и$rs
(сброса) :...соответственно.
${type_code}
используется для обозначения различныхfi
(обычный файл - по умолчанию не установлено) ,di
(каталог) ,ln
(ссылка) и любого другого типа файла, который я знаю. Существует также$no
(нормальный), который также по умолчанию не установлен и который представлен здесь//
в начале каждой строки. Мой простой маленькийIFS=:
блок работает, просто вставляя имя для каждого конфигурируемого в качестве его собственного значения и добавляя косую черту или два - хотя\0
байты NUL тоже подойдут.По умолчанию
ls
также будет вставлен один,$rs
непосредственно предшествующий его первому выводу$lc
- но это не точно представлено здесь. В этом случае я указал$ec
(код конца), который заменяет во$rs
всех случаях - когда он указан, вы не получаете лишних$rs
между$no
и,${type_code}
как в противном случае - он представляет только сразу после имени файла и один раз в начале вывода - как вы можете видеть в одной дополнительной косой черте в начале первой строки.Вот фрагмент из моего собственного
$LS_COLORS
И, по правде говоря, мой маленький взлом оболочки, вероятно, слишком сложен - есть широко доступный интерфейс для назначения этих значений. Попробуйте
dircolors -p
в вашем кли иinfo dircolors
для получения дополнительной информации об этом.Вы можете заключить имена файлов в произвольные строки. Вы можете закомментировать их, если хотите. Вы можете указать аналогичное поведение только на основе расширения файла. Там действительно не так много, вы не можете указать таким образом.
Теперь я не просто все это придумываю - я узнал об этом после того , как случайно наткнулся на исходный код .
С этой конкретной конфигурацией
ls
будет излучать:$no
- один раз за запись в начале каждой записи${type_code}
- один раз непосредственно перед каждым именем файла, чтобы включить аббревиатуру типа файла и всегда находиться в той же строке, что и 7 полей с пробелами после$no
или сразу после->
обозначения цели символической ссылки.$ec
- один раз непосредственно перед самой первой строкой, а затем только один раз сразу после каждого имени файла.Все остальные значения пусты.
Далее следует нулевой разделитель
ls
, и на этот раз я буду использоватьcat -A
, хотя без него это выглядело бы так же, как в предыдущем примере:И поэтому, чтобы надежно удалить все символические ссылки из
-l
списка ong, как этот, вы можете сделать простое изменение:Мои результаты после запуска выглядят так ...
Используя некоторую команду, подобную той, что я делаю выше:
... (где
fc1
иfc2
являются типами файлов, перечисленными послеset --
в подоболочке) должен служить для надежного удаления любых комбинаций типов файлов, которые вы можете захотетьls
выводить независимо от любых символов, которые могут содержать имена файлов.источник
lc
,nc
и т. Д.?ls
«Sdi=
значения. Вам нужно будет добавитьdi=:
в var, чтобы аннулировать это - и для всех остальных. Это то, что я имею в виду под API - вы обращаетесь к каждому типу файла, но вы должны обращаться к интерфейсу одинаково во всех случаях. Таким образом, установкаln
одного способа и игнорированиеdi
значений по умолчанию не сработает. Есть также много стандартных значений по умолчанию ... Хм. Вы спрашиваете об этом,lc
иnc
все остальное верно - полностью - я уже сделал это на днях. Я свяжу это, я думаю.dircolors
. Он читает конфигурационный файл и выдаетeval
дружественное для оболочки значение var. Это довольно легко - но так же, как и несколько строк там. В любом случае, если вы хотите использоватьdircolors
его, просто сохраните два разных файла и запустите его таким образом. Кроме того, я показал вам на днях, как сделать оба сразу с\0
разделителями NUL как часть каждой escape-последовательности.LS_COLORS='rs=:no=\0//:lc=:rc=:ec=\0//:'$( set -- di fi ln mh pi so do bd cd or su sg ca tw ow st ex; for fc do printf %s "$fc=/$fc//\0:"; done) ls -l --color=always | cat -A
Ответ выше приводит к следующему:
Как ни странно, команда 1 из ls по-прежнему дает список.
источник
grep -i
? Это не так, как будто/
может быть в верхнем или нижнем регистре.ls
по умолчанию используется формат noe-column, когда вывод не является терминалом (здесь это канал).Попробуй это:
источник
a -> b
. Он также не будет работать с именами файлов с символами новой строки и другой странностью. Пожалуйста, прочтите это, потому что разбор ls - плохая идея.ls
имеет псевдонимls -l
, и это возвращает столбцы перед именем файла, либо это не так, и это не имеет ничего общего с символическими ссылками.ls
разбирает себя. мы все анализируемls
каждый раз, когда печатаем в терминал - есть API . Я разместил ответ, демонстрирующий что-то подобное здесь - но вы можете сделать гораздо больше. Я показал вам на днях - у вас были имена файлов, разделенные нулем.ls
не собирается есть своих детей или что-то еще - это всего лишь программа. Если вы не объяснить то , что будет принимать несколько сотен , чтобы объяснить и несколько сотен , чтобы объяснить , почему несколько сотен строк вы просто связаны с неверны. И кроме того - это только две строчки:LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \ ls -1 --color=always | cat
Попробуйте эту команду:
ls -p | grep -v @
источник
find -type f
-p
просто добавляет косую черту в каталоги, вы ищете-F
ii) вашаfind
альтернатива не будет перечислять каталоги и iii) Пожалуйста, проверьте свои ответы перед публикацией.