Исключая символические ссылки из каталога

Вопрос или проблема

Я хочу исключить символические ссылки из списка директории. Я использовал следующую команду:

dir --ignore=@ -F

Но символические ссылки все еще отображаются, как показано.

скриншот

Как я могу исключить их при использовании команды dir?

Спасибо.

Вы можете использовать find, чтобы исключить символические ссылки:

find -maxdepth 1 ! -type l ! -path './.*' -ls

С помощью ! -type l я исключаю символические ссылки. Таким образом, будут отображаться директории, обычные файлы, специальные файлы и т. д.
А с помощью ! -path './.*' я исключаю скрытые файлы (например, .bashrc,.profile)

Если вы хотите получить вывод, как при использовании ls или dir, тогда вам следует использовать:

#С цветом
find -maxdepth 1 ! -type l ! -path './.*' -exec ls --color=yes -Fd {} +

#Без цвета
find -maxdepth 1 ! -type l ! -path './.*' -exec ls -Fd {} +

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

dir -Fd -- *(^@)

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

Если вам просто нужно увидеть список, вам даже не нужно вызывать dir (или более юниксный ls), вы можете передать их встроенной команде print в zsh.

Например:

print -rC1 -- *(^@)

Это print их rавом в 1 Cолонке.

Использование квалайфера Mark добавляет / в конце файлов типа директория, как это делает dir -F, но это только для директорий.

print -rC1 -- *(M^@)

--ignore не работает на типах, он работает на шаблонах. Например, если у вас есть файлы:

$ ls 
a.txt b.dat c.txt d.dat
$ ls --ignore="*.txt"
b.dat d.dat

Нет простого способа отфильтровать символические ссылки, но вы можете попробовать использовать grep

ls -F | grep -v "@"

У меня аналогичная проблема, и так как это один из первых результатов Bing для linux tree exclude symbolic links, вот как заставить команду tree не следовать за символическими ссылками:

tree -I '@*'

или

tree --nolinks

Флаг -I предназначен для шаблонов, которые должны быть исключены из рекурсии, и символические ссылки “невидимо” начинаются с @. Символические ссылки все еще будут отображаться, но не будут исследоваться дальше.

Хотя в документации указано, что tree по умолчанию не следует символическим ссылкам, это опечатка, как объясняется в этой ответе. По умолчанию команда tree не следует символическим ссылкам, которые указывают на файлы, уже перечисленные в этой команде.

Ответ или решение

Как исключить символические ссылки из вывода команды dir в Linux

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

1. Использование команды find

Один из самых эффективных способов — это выполнить команду find, которая может легко фильтровать файлы по типу. Вот пример команды, которая исключает символические ссылки:

find . -maxdepth 1 ! -type l -ls

Здесь ! -type l исключает символические ссылки, и вы получите список всех остальных файлов и каталогов в текущем каталоге. Ключ -maxdepth 1 используется для ограничения поиска только текущим каталогом, не углубляясь в вложенные папки.

Если хотите, чтобы вывод более походил на ls или dir, используйте следующую команду:

find . -maxdepth 1 ! -type l -exec ls -F {} +

Эта команда вызовет ls, чтобы отобразить файлы в привычном виде.

2. Использование оболочки zsh

Если вы используете оболочку zsh, вы можете воспользоваться её возможностями для фильтрации файлов. Вот команда, которая исключит символические ссылки:

dir -Fd -- *(^@)

Этот синтаксис использует знакомые символы * для выборки всех файлов, исключая символические ссылки (обозначенные @).

Примечание

Если вы просто хотите увидеть список без вызова dir, вы можете использовать:

print -rC1 -- *(^@)

Эта команда выведет файлы в одном столбце без символических ссылок.

3. Использование grep для фильтрации

Если у вас сложная структура файлов и вы уже используете команды, такие как ls, вы можете отфильтровать вывод с помощью grep:

ls -F | grep -v '@'

Здесь grep -v '@' исключает строки, содержащие символ @, который указывает на символические ссылки.

4. Команда tree для обхода символических ссылок

Если вы используете команду tree, вы можете воспользоваться следующими опциями:

tree -I '@*'

Или более простая команда:

tree --nolinks

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

Заключение

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

Изучите эти команды, чтобы оптимизировать вашу работу с файловой системой и повысить продуктивность при выполнении задач.

Оцените материал
Добавить комментарий

Капча загружается...