Intereting Posts
Как решить «Блокировать контрольную сумму растрового изображения не совпадает с растровым при попытке проверить файловую систему»? Поддержка Mediawiki была удалена в стабильной версии Debian (jessie). Какая альтернатива? Странное поведение в $ (dirname `readlink -f $ 0`) Systemd restart, если один из процессов в группе управления не работает Печать диапазонов вывода с эхом добавление строк в начале файла установить команду gnu Является ли Vim иммунным для атаки с копией-пастой? Linux: как получить все журналы входа из моей системы Ответ на тот же интерфейс, что и входящий? Сортировка строк при группировке отступов с их родительским Какие отношения связаны с маскировкой ACL и стандартным групповым разрешением на файл? Запуск сервера для выключения при получении сигнала через последовательный порт (RS232) Временные метки каталога? Как получить флаги компилятора, которые используются для сборки двоичных файлов в пакете (.deb)?

Есть ли замена «ls», которая может обрабатывать подстановочные знаки?

Я только что узнал, что ls не может обрабатывать подстановочные знаки ( ls '*' не работает), и поэтому оболочка делает это до вызова ls. Поэтому поведение ls можно считать логически для людей, работающих 20 лет с unix, для меня это не так, и я не поддерживаю ls.

Мне нужна команда каталога, которая сканирует файлы и каталоги, а затем применяет фильтр подстановочных знаков. Так что ls cr* не перечисляет файлы внутри каталога «cron.daily».

Я знаю, что есть ls -d и я сделал alias lx=ls -lartd . Но потом я понял, что ls -d без каких-либо аргументов по какой-то секретной причине вообще не работает.

Есть ли замена, которую я могу установить?

Вы можете использовать find , который (на многих платформах) имеет опцию -ls . Таким образом, вы могли бы сделать

 find . -maxdepth 1 -name '*' -ls 

Но если трудно запомнить ls -d , вы можете не найти улучшения.

Если вам нужна команда cmd так что cmd cr* перечисляет cron.daily , то эта команда – ls -d . Если это слишком много, вы можете определить псевдоним . Например, введите эту строку в ~/.bashrc :

 alias l='ls -d' 

Затем запуск l cr* будет отображать информацию о самом cron.daily , а ls cr* l cr* будет отображать содержимое каталога cron.daily (и любого другого каталога, соответствующего шаблону, и любой другой cron.daily соответствующий шаблону).


ls -d работает. Он выполняет именно то, что вы просили: он перечисляет текущий каталог. Это может быть не очень полезно – ls -ld несколько полезен, но не ls -d – но компьютеры делают то, что вы им говорите, они не читают ваши мысли, чтобы узнать, что вы хотели.

Если вы хотите получить эффект ls -d , за исключением того, что без аргументов вы получаете список текущего каталога, вы можете определить функцию.

 l () { if [ $# -eq 0 ]; then ls -l else ls -ld "$@" fi } 

Затем l cr* перечисляет файлы, имя которых начинается с cr , даже если они являются каталогами. И l cron.daily перечисляет cron.daily сам, а не его содержимое; вы можете использовать ls cron.daily или l cron.daily/* чтобы перечислить содержимое. Но l перечисляет файлы в текущем каталоге.

С помощью функции выше l -a будет передавать флаг -d . Если вы этого не хотите, вы можете отключить опцию функции при определении наличия аргументов имени файла.

 l () { local a a=("$@") while [[ $1 = -* ]]; do shift; done if [ $# -eq 0 ]; then ls -l "${a[@]}" else ls -ld "${a[@]}" fi } 

Если вам нужна команда cmd так что cmd cron.daily перечисляет файлы в подкаталоге cron.daily , но cmd cd* перечисляет cron.daily сам, тогда это невозможно в bash. К моменту выполнения команды оболочка расширила подстановочные знаки, и команда не может знать, были ли вы использованы подстановочные знаки или нет.

Это возможно в zsh , потому что в zsh вы можете отключить расширение подстановки для определенной команды. Zsh не является оболочкой по умолчанию для большинства систем, но это всего лишь одна установка пакета. В zsh вы можете определить псевдоним с префиксом noglob :

 alias l='noglob list_files_or_directory_contents' 

Затем вам нужно будет определить функцию list_files_or_directory_content – ваше требование необычно, поэтому, вероятно, оно еще не существует. Вот функция, которая, как я думаю, делает то, что вам нужно: перечислите содержимое указанных каталогов напрямую и перечислите сами каталоги, если они произойдут из подстановочного расширения.

 list_files_or_directory_contents () { local arg matches setopt local_options no_csh_null_glob no_null_glob no_nomatch no_glob_subst no_sh_word_split if (($#==0)); then # No arguments: list the directory itself ls -l else for arg; do matches=($~arg) if [[ $#matches -eq 1 && $matches[1] == $arg ]]; then # Not a wildcard pattern: list the directory contents if it's a directory ls -l -- $arg else # Wildcard pattern: list the matches themselves, even the ones that are directories ls -ld -- $matches fi done fi } 

Я думаю, что это будет делать то, что вы хотите. Подход, я полагаю, может быть применен к множеству утилит, которые вы хотели. Но я действительно не рекомендовал бы это, потому что он сломает ваши «привычки пальцев», когда вы перейдете к новой системе, которую вы еще не настроили.

 ls() { [[ 0 == $# ]] && set -- *; /bin/ls -d "$@"; } 

В дальнейшем ваш псевдоним будет заменен этой функцией:

 lx() { [[ 0 == $# ]] && set -- *; /bin/ls -lartd "$@"; } 

Вот функция оболочки, которая делает то, что вы хотите. Вы можете вставить его прямо в свой терминал или добавить его в файл инициализации вашей оболочки (например, ~/.bashrc для bash):

 function dir { if [ -n "$1" ] then ls -lartd "$@" else ls -lartd * fi }