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

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

Есть ли быстрый и простой способ пометить файлы в 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. Любая помощь будет оценена по достоинству.

решение1

Я не думаю, что вы можете надежно (неправильно) использовать любую доступную функцию, чтобы заставить обычный 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.

Связанный контент