простой способ описания / маркировки файлов в bash

398
Edoardo

Есть ли быстрый и простой способ пометить файлы в Bash, чтобы такой список, как этот

-rw------- 1 root 88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C -rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E -rw------- 1 root 248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990 -rw------- 1 root 293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1 -rw------- 1 root 120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC -rw------- 1 root 20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892 -rw------- 1 root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C -rw------- 1 root 1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C 

становится примерно таким (или похожим)

-rw------- 1 root 88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C -rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E -rw------- 1 root 248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990 -> MYOLDFILE1 -rw------- 1 root 293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1 -rw------- 1 root 120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC -> MYNEWFILE.TXT -rw------- 1 root 20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892 -rw------- 1 root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C -> hello.c -rw------- 1 root 1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C 

Я пытался что-то сделать с этим, ln -sно затем я получаю много дубликатов, потому что ссылки находятся в одном каталоге, и чтобы получить хороший вид, я должен отфильтровать ls с помощью grep.

0
Вы хотите `attr`, то есть расширенные атрибуты? choroba 6 лет назад 0
Это вывод `ls`? Кажется, вы используете опцию `-L` (с некоторыми другими, чтобы скрыть группу или владельца). Попробуйте `/ bin / ls -l` Paulo 6 лет назад 0
да, это выходы из псевдонима `ll`, который в настоящее время определяется как` ls -alF`, меня не волнуют владения и / или атрибуты Edoardo 6 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski

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

Я бы не стал переопределять lsсебя, по крайней мере, в этом примере, который должен быть простым доказательством концепции . Поддержка переключателей командной строки lsсделало бы пример слишком сложным.

Для реализации моего решения вам нужна файловая система, поддерживающая расширенные атрибуты и инструменты для управления ими (например, apt-get install attrв Debian).

Чтобы установить атрибут:

setfattr -n user.mytag -v "hello.c" "8C8C190C-5340-421C-96D1-D4111C5E062C" 

Примечание: mytagэто произвольное имя. Выберите один и придерживайтесь его.

Чтобы удалить атрибут:

setfattr -x user.mytag "8C8C190C-5340-421C-96D1-D4111C5E062C" 

Вы можете создавать собственные сценарии или функции для более удобного выполнения этих задач. Теперь предположим, что вы решили llделать то, что вы хотите. Если это псевдоним, сначала нужно удалить его:

unalias ll 

Затем определите функцию:

function ll() { find "$@" -maxdepth 1 -exec \ sh -c ' a=$(getfattr -n user.mytag --only-values "$1" 2>/dev/null) ls -dalF -- "$1" | tr -d "\n" if [ -z "$a" ]; then printf "\n"; else printf " => %s\n" "$a"; fi ' sh {} \; } 

Примеры использования:

ll # but see notes below ll 8C8C190C-5340-421C-96D1-D4111C5E062C ll /bin ll foo.txt bar.txt 

Пример вывода:

-rw------- 1 root root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C => hello.c 

Заметки:

  • Я использовал =>, нет ->, потому что последний уже используется lsдля символических ссылок.
  • POSIX требует по крайней мере один путь в findвызове. Единственный ll(без аргументов) может привести findк сбою (сравните этот ответ ). Если это так, вам понадобится некоторая предварительная логика, чтобы перейти .к find.
  • -maxdepthтоже не POSIX. Если вы не можете использовать его, посмотрите этот вопрос .
  • Функция просто передает все свои аргументы find(as "$@"). Это означает, что этот пользовательский llинтерфейс не понимает параметры, обычно используемые ls(или общий llпсевдоним). С другой стороны, вводят тесты вfind можно.
  • Специальные или непечатаемые символы в именах или тегах могут вызвать неожиданный вывод.
  • ls -dalFвызывается для каждого объекта отдельно, поэтому результирующие строки могут не выравниваться по обычным столбцам. Рассмотрите -printfдействие вместо того, lsчтобы печатать всю необходимую вам информацию, кроме тега, который все еще потребуется getfattr. Использование табуляции в качестве разделителя в -printfформате приведет к колонизации многострочного вывода (по крайней мере, до некоторой степени). Обратите внимание, что с правильным -printfформатом вам не понадобится tr.

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