содержание ls каталога, игнорирующего символьные ссылки

 why doesn't it? 

существует понятие планирования, далее оно также зависит от количества ядра. В моей системе эта программа не может вызвать больше чем 13%-е использование CPU (пока Вы не пишете, многоядерная программа управления).You может попробовать некоторый инструмент сравнительного тестирования и видеть, что Ваша вершина сообщает о 100%-м использовании CPU.

How would the int overflow affect the memory?

После-231 Вашего интервала i будет иметь значение 0 снова.

17
02.02.2015, 10:51
8 ответов
[

]Для указанного вопроса можно использовать [][]find[][]:[

] [
find . -mindepth 1 ! -type l
] [

]перечислит все файлы и каталоги в текущей директории или любых подкаталогах, которые не являются сим-ссылками.[

] [

][]mindepth 1[] - это просто пропустить запись [].[] current-directory entry. Его суть - комбинация []-типа l[], что означает "является символической связью", и []![], что означает отрицание следующего теста. В комбинации они соответствуют каждому файлу, который не является символической ссылкой. Здесь рекурсивно перечислены все файлы и каталоги, но отсутствуют симлинки.[

] [

]Если вам нужны только обычные файлы (а не каталоги):[

] [
find . -type f
] [

]Чтобы включить только дочерние каталоги этого каталога, а не всех остальных рекурсивно:[

] [
find . -mindepth 1 -maxdepth 1
] [

]Вы можете объединить эти (и другие) тесты вместе, чтобы получить список файлов, которые вам нужны. [

] [

]Для выполнения определенной []grep[] для каждого файла, совпадающего с используемыми вами тестами, используйте []-exec[]:[

] [
find . -type f -exec grep -H 'some pattern' '{}' +
] [

]Файлы будут заменены на []'{}'[]. С помощью []+[] необходимо сообщить []find[], что Ваша команда выполнена. Опция []-H[] заставляет grep отображать имя файла, даже если он выполняется с одним подходящим файлом.[

].
28
27.01.2020, 19:46
[

]Попробуйте эту команду: []ls -p | grep -v @[][

]
-3
27.01.2020, 19:46
[

] Начиная с версии 2.12, опция []-r[] для GNU grep не разыменовывает символические ссылки, если только вы не укажете их вручную:[

] [
] [

]-r, --recursive[

] [

]Считывание всех файлов под каждой директорией, рекурсивно, по следующим символическим ссылкам только если они в командной строке. Это эквивалентно -d вариант рекурса. [

] [

]-R, --dereference-recursive [

] [

]Считывайте все файлы под каждой директорией рекурсивно. Следуйте по всем символическим ссылкам, в отличие от -r.[

] [
]
7
27.01.2020, 19:46

В zsh, это было бы легко благодаря глобусным классификаторам :

grep -- PATTERN **/*(.)

шаблон **/ рекурсивно пересекает подкаталоги. Классификатор глобуса . ограничивает соответствие обычным файлам.

Без zsh используйте найдите (см. ответ Майкла Хорнера ). И в этом конкретном случае GNU grep может делать то, что вы хотите (это именно то, что делает grep -r) - но только начиная с версии 2.12, более ранние версии следовали по символическим ссылкам.

5
27.01.2020, 19:46

Попробуйте это:

ls | grep -v " -> "
-2
27.01.2020, 19:46

Для этого вы можете использовать $ LS_COLORS . Если ваша версия ls поддерживает указание цветов с помощью этой переменной, вы можете определить вывод для каждого типа файла. Это встроенное поведение и очень настраиваемое. Итак, я создал несколько файлов для демонстрации этого, например:

for f in 9 8 7 6 5 4 3 2 1
    do touch "${f}file" && 
    ln -s ./"${f}file" ./"${f}filelink"
done

Итак, теперь я сделаю:

LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | cat

###OUTPUT###
1file


HERE_THERE_BE_A_LINK>>1filelink@
2file


HERE_THERE_BE_A_LINK>>2filelink@
3file

...
HERE_THERE_BE_A_LINK>>8filelink@
9file
...

И нули тоже там ...

LS_COLORS='lc=:rc=:ec=:ln=\n\n\0HERE_THERE_BE_A_LINK>>\0:' \
ls -1 --color=always | sed -n l
1file$
$
$
\000HERE_THERE_BE_A_LINK>>\0001filelink@$
2file$
$
$
\000HERE_THERE_BE_A_LINK>>\0002filelink@$
3file$
...

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

LS_COLORS='rs=:no=//:lc=:rc=:ec=//:'$(
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//:"
done) ls -l --color=always | cat

Его вывод в моем домашнем каталоге выглядит так:

total 884
///-rw-r--r-- 1 mikeserv mikeserv    793 Jul  9 11:23 /fi//1/
//drwxr-xr-x 1 mikeserv mikeserv    574 Jun 24 16:50 /di//Desktop//
//-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 /fi//Terminology.log/
//-rw-r--r-- 1 mikeserv mikeserv      0 Jul  6 11:24 /fi//new
file/
//lrwxrwxrwx 1 mikeserv mikeserv     10 Jul 11 04:18 /ln//new
file
link/ -> /fi//./new
file/
//-rwxr-xr-x 1 mikeserv mikeserv    190 Jun 22 11:26 /ex//script.sh/*
//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//shot-2014-06-22_17-10-16.jpg/
//-rw-r--r-- 1 mikeserv mikeserv     68 Jun 17 19:59 /fi//target.txt/

Вы можете запустить это с помощью cat -A ] тоже, и единственная разница, с которой вы столкнетесь, заключается в том, что вы увидите $ для новой строки - в этой конфигурации нет непечатаемых символов, введенных ls --color = always - только что вы здесь видите.

ls вставляет экранирование терминала по умолчанию следующим образом:

${lc}${type_code}${rc}FILENAME${lc}${rs}${rc}

... где значения по умолчанию для $ lc (слева от кода) , $ rc (справа от кода) и $ rs (сброс) :

 \033 - ESCAPE
 m - END ESCAPE
 0 - reset 

... соответственно. $ {type_code} используется для замены различных fi (обычный файл - по умолчанию не задан) , di (каталог) , ln (ссылка) и все остальные типы файлов, о которых я знаю. Существует также $ no (нормальный) , который также по умолчанию не установлен и представлен здесь // в начале каждой строки. Мой простой маленький блок IFS =: работает, просто вставляя имя для каждого настраиваемого параметра в качестве его собственного значения и добавляя косую черту или два - хотя \ 0 NUL байтов тоже подойдут. .

По умолчанию ls также вставит один $ rs , непосредственно предшествующий его первому выходу $ lc - но это не точно представлено здесь. В этом случае я указал $ ec (конечный код) , который заменяет $ rs во всех случаях - когда он указан, вы не получаете лишнего ] $ rs между $ no и $ {type_code} , как и в противном случае - он отображается только сразу после имени файла и один раз в начале вывод - как вы можете видеть в одной дополнительной косой черте в начале первой строки.

Вот отрывок из моего собственного $ LS_COLORS

printf %s "$LS_COLORS"

rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:\
so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:\
or=40;31;01:su=37;41:sg=30;43:ca=30;41:\
tw=30;42:ow=34;42:st=37;44:ex=01;32:\
*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:...

И, по правде говоря, мой небольшой взлом оболочки, вероятно, слишком сложен - есть широко доступный интерфейс для назначения этих значений. Попробуйте dircolors -p в вашем cli и info dircolors для получения дополнительной информации.

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

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

В этой конкретной конфигурации ls будет выдавать:

  1. $ no - один раз для каждой записи в начале каждой записи

  2. $ {type_code} - один раз непосредственно перед каждой имя файла, чтобы включить сокращение типа файла и всегда находиться в той же строке, что и 7 полей, разделенных пробелами, после $ no или сразу после -> , обозначающих символическую ссылку цель.

  3. $ ec - один раз непосредственно перед самой первой строкой и после этого только один раз сразу после каждого имени файла.

  4. Все остальные значения пусты.

Далее следует разделенный нулем ls , и на этот раз я буду использовать cat -A , хотя без него он выглядел бы так же, как в последнем примере:

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

total 884$
^@//^@//-rw-r--r-- 1 mikeserv mikeserv    793 Jul  9 11:23 /fi//^@1^@//$
^@//drwxr-xr-x 1 mikeserv mikeserv    574 Jun 24 16:50 /di//^@Desktop^@///$
^@//-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 /fi//^@Terminology.log^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv      0 Jul  6 11:24 /fi//^@new$
file^@//$
^@//lrwxrwxrwx 1 mikeserv mikeserv     10 Jul 11 04:18 /ln//^@new$
file$
link^@// -> /fi//^@./new$
file^@//$
^@//-rwxr-xr-x 1 mikeserv mikeserv    190 Jun 22 11:26 /ex//^@script.sh^@//*$
^@//-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 /fi//^@shot-2014-06-22_17-10-16.jpg^@//$
^@//-rw-r--r-- 1 mikeserv mikeserv     68 Jun 17 19:59 /fi//^@target.txt^@//$

Итак, чтобы надежно удалить все символические ссылки из -l онг-листинга, подобного этому, вы можете внести простое изменение:

LS_COLORS='rs=:no=//:lc=:rc=:ec=/ :'$(
set -- di fi mh pi so do bd cd or su sg ca tw ow st ex
for fc do printf %s "$fc=$fc/:"
done)ln=///: ls -l --color=always | sed ':ln
\|///|{N;\|\n//|!bln};s|.*//||'

Мои результаты после запуска выглядят так: ...

total 884
-rw-r--r-- 1 mikeserv mikeserv    793 Jul  9 11:23 fi/1/ 
drwxr-xr-x 1 mikeserv mikeserv    574 Jun 24 16:50 di/Desktop/ /
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 fi/Terminology.log/ 
-rw-r--r-- 1 mikeserv mikeserv      0 Jul  6 11:24 fi/new
file/ 
-rwxr-xr-x 1 mikeserv mikeserv    190 Jun 22 11:26 ex/script.sh/ *
-rw-r--r-- 1 mikeserv mikeserv 433568 Jun 22 17:10 fi/shot-2014-06-22_17-10-16.jpg/ 
-rw-r--r-- 1 mikeserv mikeserv     68 Jun 17 19:59 fi/target.txt/ 

Используя некоторую команду, подобную той, что я делаю выше:

LSCOLORS=...$(...)fc1=///:fc2=///: ls ... | sed ...

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

2
27.01.2020, 19:46

или, проще:

ls -l | grep -v ^l

Объяснение

LS -L означает, что в списке в длинная форма . Когда вы делаете это, первая строка символов дает информацию о каждом файле. Первый символ указывает, какой тип каждого файла есть. Если это симличинка, то l - первый символ.

GreeP -V ^ L означает фильтр ( -V ) Линии, начинающиеся с ( ^ ) A L .

17
27.01.2020, 19:46

Ответ выше приводит к следующему:

 ls -1F | grep -i "/"

Как ни странно, отсутствие 1 в команде ls по-прежнему дает список.

0
27.01.2020, 19:46

Теги

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