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