Intereting Posts
Последние версии всех приложений в Ubuntu 12.10 Задержка загрузки из-за несуществующего диска SATA Возможно ли иметь комментарии в многострочных командах в рыбе? Драйвер звука FreeBSD 9 Два контейнера LXC с использованием двух разных физических сетевых интерфейсов Есть ли способ узнать, какие веб-страницы доступны клиенту на веб-сервере UNIX? Сценарий, вызываемый в rc.local, запускает только вторую команду, а не первую named-checkzone не удаляет файл с обратной зоной с NS, нет записей адресов (A или AAAA) веб-браузеры увеличивают по умолчанию в Ubuntu 14.04.5 LTS Использование Rsync совместно с Find 256 цветов в Zsh Какие сайты можно добавить в тост? Команда даты не работает на удаленном сервере при запуске с использованием скрипта Как я могу просто получить доступ к полезной нагрузке пакета и изменить его? Как перейти от csh к bash в качестве оболочки по умолчанию

сортировать данные ls пользователями

В Linux существует ли способ сортировать данные ls пользователями ? Я пытаюсь добиться чего-то вроде этого:

user_ a file1
user_ a file2
user_ b another_file
user_ c this_file
user_ c that_file
user_ d file3

Я знаю, что список, подобный этому, также будет содержать размер файла, разрешения и т. Д. – моя главная проблема – сортировка пользователями. Было бы очень удобно, не было бы этого

До сих пор я нашел ls -l | sort -k 3 ls -l | sort -k 3 для сортировки по столбцу три, который [при использовании ls -l ] содержит владельца файла [таким образом, sort -k 4 для сортировки по группе].

НО что, если владелец файла не входит в третий ряд? Есть ли другой способ достичь этого, независимо от числа столбцов ?


Обновление : я забыл упомянуть, что я работаю в BASH и стараюсь придерживаться его довольно долго отсюда, поэтому вещи не усложняются.

Определение того, в каком столбце указано имя владельца, из одного вывода ls -l не зная, что это невозможно. Вы можете попытаться сопоставить записи в каждом столбце с файлом passwd , но нет никакой гарантии, что вы не будете соответствовать столбцу группы или столбцу имени файла, который может содержать только имена, которые вы найдете в /etc/passwd .

Если вы хотите пойти с ls , вы можете запустить программу дважды, один раз, как ls -l и один раз, как ls -g . Последний убирает владельца, поэтому, сопоставляя строки на основе другой информации, вы сможете определить имя владельца без спецификации. Однако это не упражнение, которое я бы с удовольствием сделал в сценарии оболочки bash.

С помощью zsh вы можете определить порядок сортировки и использовать его в классификаторах подстановки:

 zmodload zsh/stat uid() zstat -A REPLY +uid -- $REPLY ... *(no+uid) 

( n для численного порядка, o для порядка , +uid к порядку с uid функцией). Идея состоит в том, чтобы иметь функцию, которая принимает имя файла в $REPLY и возвращает что-то в $REPLY которое сортирует zsh .

Так, например, с GNU ls :

 ls -ldU -- *(no+uid) 

С помощью только инструментов GNU эквивалент будет примерно таким:

 find . ! -name . -prune -printf '%U\t%p\0' | sort -zn | tr '\0\n' '\n\0' | cut -f2- | tr '\0\n' '\n\0' | xargs -r0 ls -ldU 

Не разбирайте ls : используйте stat

 stat -c "%U %n" -- * | sort 

Поскольку ОП не предусматривает конкретных требований к переносимости (кроме использования в Bash), а так как разбор ls, по- видимому, остается популярным подходом, и поскольку решение на основе stat не похоже на то, чтобы обрабатывать новые строки в именах файлов лучше (кто ставит новые строки в именах файлов?), я собираюсь бросить в свое предложение самое элегантное решение:

Я считаю, что у ОП фактически был почти лучший ответ. Это просто нужно избегать, чтобы предотвратить непредвиденное поведение от сглаживания (помните, это решение, специфичное для Bash):

 \ls -l | sort -k 3 

18 символов, требуется только ls и sort , и нет циклов. Элегантный, легкий для понимания и надежный.

Кроме того, как указал Оливье в своем ответе, может быть желательно ограничить sort только третьим столбцом, а не всей строкой, начинающейся с этого столбца:

 \ls -l | sort -k 3,3 

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

1) Определите, в каком столбце указано имя:

 myls='ls -al' echo '+' > /tmp/MYOWNFILE.$$ #so file will be of size 2, "+" and newline. zeuser=$( $myls /tmp/MYOWNFILE.$$ | awk -v myname=$(whoami) '{ for (field=1;field<=NF;field++) { if ($field == myname) { print field ; break } } }' ) zesize=$( $myls /tmp/MYOWNFILE.$$ | awk '{ for (field=1;field<=NF;field++) { if ($field == 2) { print field ; break } } }' ) zename=$( $myls /tmp/MYOWNFILE.$$ | awk -v filename=/tmp/MYOWNFILE.$$ '{ for (field=1;field<=NF;field++) { if ($field == filename) { print field ; break } } }' ) rm /tmp/MYOWNFILE.$$ 

Он помещает в переменную zeuser столбец с указанием имени пользователя
Я также определяю zesize = столбец, содержащий размер, а zename = столбец, содержащий имя файла

Я положу команду ls в переменную, поэтому строки, определяющие столбец, используют фактическую команду, используемую позже (в случае ее изменения и изменения столбца)

2) используйте сортировку для сортировки по этой колонке:

 $myls | sort -k${zeuser},${zeuser} #sort ONLY on column of usernames (see last example for bad alternative) $myls | sort -k${zeuser},${zeuser} -k${zename},${zename} #sort on user, and then on filename $myls | sort -k${zeuser},${zeuser} -k${zesize},${zesize}nr #sort on user, # and then on size #modifiers: 'n'=order Numerically (and not alphabetically), # 'r'=Reverse order $myls | sort -k${zeuser} #sort STARTING FROM user column, which is probably not what you want! #indeed the next column is probably the group, then the size... #It will be sorting in a not so usefull way (especially as the # size will be sorted alphabetically instead of numerically) 

Вот небольшой вкладыш, который должен сделать это для вас:

\ls -l | sort -k$(for i in {1..5}; do field=$(\ls -ld ~ | cut -d' ' -f$i); if [ x$field = x$(whoami) ]; then echo $i; break; fi; done)

Я просто прохожу через каждое поле в ls -l выполненном в вашем домашнем каталоге, пока не найду поле, которое соответствует вашему имени пользователя, и заменив это число на использование опции -k для sort .

Я не эксперт, поэтому некоторые из них могут быть версией bash или GNU, но она отлично работает на моей машине.

Я выбрал 1-5, потому что это должно быть так далеко, как вам нужно, чтобы найти пользователя. Вы могли бы использовать больше чисел, особенно если вы сохранили вывод ls -ld ~ в строке вместо вызова каждый раз и, вероятно, могли бы оптимизировать еще больше, если бы сохранили результаты в массиве и ссылались на этот путь. Но это было быстро и грязно, с моей головы, один раз использовал ответ.