Есть ли быстрый и простой способ пометить файлы в 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 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .