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