Ви можете використовувати $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
в своєму кліпі і info dircolors
для отримання додаткової інформації про це.
Ви можете загортати назви файлів у довільних рядках. Ви можете прокоментувати їх, якщо хочете. Ви можете вказати подібну поведінку, засновану лише на розширенні файлу. Адже насправді не так багато можна вказати.
Зараз я не просто все це складаю - я дізнався про це після випадкового натикання на вихідний код .
З цією конкретною конфігурацією ls
випромінюється:
$no
- один раз на запис на початку кожного запису
${type_code}
- один раз безпосередньо перед кожним іменем файлу, щоб включити абревіатуру типу файлу, яка завжди зустрічається в тому ж рядку, що і 7 полів, розмежованих пробілом, після $no
або відразу після ->
позначення цілі символічного посилання.
$ec
- один раз безпосередньо перед першим рядком, а потім лише один раз одразу після кожного імені файлу.
Усі інші значення порожні.
Далі йде з нульовим обмеженням 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
виводу незалежно від будь-яких символів, які можуть містити назви файлів.