Выведите список файлов в домашней директории максимально возможным количеством способов, без использования ls или его алиасов(1 способ — 1 балл)
Такое же задание чуть позже прилетело в ещё один чат, и вот что из этого получилось:
1. echo и print
for i in ~/* ~/.* ; do echo $i ; done
Ровно то же самое выдаст замена команды echo на print.
На самом деле можно обойтись и без цикла, получится не так красиво, но под условие задачи вполне подходит.
echo ~/* ~/.*
2. tree
Более очевидный способ — использовать tree, который практически ls если подобрать правильные ключи.
tree -aiL 1 ~
3. find
Тоже более чем очевидное решение.
find ~ -maxdepth 1 -mindepth 1
4. du
Да, про du народ не забыл.
du -ad 1 ~
5. tar
Переходим к
tar -cvf /dev/null --no-recursion ~/* ~/.* 2>null
6. 7. Perl и Python
Так как в условии задачи я забыл поставить ограничение на интерпретаторы, которые в современных линуксах обычно есть в системе из коробки, то кашевары и змееводы не смогли остаться в стороне:
Perl:
perl -e 'use feature "say"; opendir my $dh, "." or die "Could not open . for reading: $!\n"; while (my $thing = readdir $dh) { say $thing; };'
Python:
echo -e "import os\nfor i in os.listdir(os.getenv('HOME')): print(i)" | python
Вне конкурса
Выдали на гора даже исходник на C, но хоть компилятор и присутствует практически везде, кроме всяких emmbedded дистрибутивов, я посчитал это уж совсем полным беспределом. ;-)
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#define HOME getenv("HOME")
int main(int argc, char const *argv[])
{
struct dirent *dp;
DIR *dir = opendir(HOME);
while ((dp = readdir(dir)) != NULL)
printf("%s\n", dp->d_name);
closedir(dir);
return 0;
}
P.S.
Вероятно, где-то в coreutils/findutils участники развлекухи что-то пропустили. Были неудачные попытки использовать less/more, но может у хабровчан тоже появились идеи по нестандартному использованию стандартных утилит.
Upd. 1
Спасибо хабр! Комменты, это просто праздник какой-то! И по их мотивам я готовлю новый пост. Оставайтесь на связи!
Upd. 2
Как я и обещал, вторая часть «Марлезонского балета».
Комментарии (128)
027
11.09.2019 09:26+1cp ~/ <Tab><Tab>
mv ~/ <Tab><Tab>
dd if=~/ <Tab><Tab>
и т.п.MaxVetrov
12.09.2019 21:39можно несуществующую команду:
a ~/[TAB][TAB]
! ~/[TAB][TAB]
можно для текущей директории такое:
![TAB][TAB][TAB]
PS. Пока эксперементировал, нашел devbash :)`/[TAB][TAB]
выдает:
binbash: bad substitution: no closing "`" in `/bin
etcbash: bad substitution: no closing "`" in `/etc
lib64bash: bad substitution: no closing "`" in `/lib64
mntbash: bad substitution: no closing "`" in `/mnt
runbash: bad substitution: no closing "`" in `/run
tmpbash: bad substitution: no closing "`" in `/tmp
bootbash: bad substitution: no closing "`" in `/boot
homebash: bad substitution: no closing "`" in `/home
libx32bash: bad substitution: no closing "`" in `/libx32
optbash: bad substitution: no closing "`" in `/opt
sbinbash: bad substitution: no closing "`" in `/sbin
usrbash: bad substitution: no closing "`" in `/usr
cdrombash: bad substitution: no closing "`" in `/cdrom
libbash: bad substitution: no closing "`" in `/lib
lost+foundbash: bad substitution: no closing "`" in `/lost+found
procbash: bad substitution: no closing "`" in `/proc
srvbash: bad substitution: no closing "`" in `/srv
varbash: bad substitution: no closing "`" in `/var
devbash: bad substitution: no closing "`" in `/dev
lib32bash: bad substitution: no closing "`" in `/lib32
mediabash: bad substitution: no closing "`" in `/media
rootbash: bad substitution: no closing "`" in `/root
sysbash: bad substitution: no closing "`" in `/sys
027
12.09.2019 21:45Я за эти клавиатурные таб-таб каюсь, ибо совсем забыл, что:
- автоподстановка не является всеобщим правилом для *никсов, а есть только там, где она сознательно реализована мейнтейнером для конкретного окружения конкретной версии*;
- есть способ посмотреть без выстукивания по клаве, что выдаст автоподстановка в разных ситуациях, а именно — команда баша
compgen
.
*) например, автодополнение в моей системе живет тут:/etc/bash_completion
и тут:/etc/bash_completion.d
.MaxVetrov
13.09.2019 21:26Заинтересовался автодополнением.)
А с помощью complete можно эту задачу решить?
POPSuL
11.09.2019 09:46Так конечно делать не нужно, но если уж совсем нет других вариантов…
Я предупреждалyes "n" | rm -i $HOME/* $HOME/.* 2>&1 | grep -o "$HOME[^»'’]*"
027
11.09.2019 19:56Я предупреждал
Но мы же все делаем бэкап $HOME, правда?orthanner
13.09.2019 07:50Конечно. В $HOME/.backup :-)
027
13.09.2019 20:15+1А-а-а! Ты знал!!!
$ ls -1 ~ ... 027 1 backup projects scripts Видео Документы ...
SlavniyTeo
15.09.2019 08:40Я не осуждаю, но в этом топике листинг домашней директории можно было привести и без использования ls
Pilat
11.09.2019 09:46Самый простой способ — создать архив файлов в нужной директории а потом вывести листинг архива. Это поддерживает куча архиваторов. Можно и рекурсивно.
vladkorotnev
11.09.2019 10:21Что-то подобное через tar как раз и описано, только листинг выводится при упаковке
deniss-s
11.09.2019 09:54grep "" -lr . less .
027
11.09.2019 10:06Вышенаписанные варианты
$ less .
у меня выводят:$ vi .
. is a directory
выводит все потроха рекурсивно (не уверен, что это соответствует условию задачи)grep "" -lr .
deniss-s
11.09.2019 10:14Странно, что
less
себя так ведёт, может зависит от шела? У меня в bash показывает содержание текущей директории.
С
grep
можно попробовать такой вариантgrep "" -l ./*
, правда формат вывода директорий, не очень красив.027
11.09.2019 10:22Странно, что less себя так ведёт, может зависит от шела?
Наверное. У меня
$ bash --version GNU bash, версия 4.4.20(1)-release (x86_64-pc-linux-gnu)
$ lsb_release -d Description: Linux Mint 19.1 Tessa
«nano .» то же самое пишет, разве что по-русски.eumorozov
11.09.2019 12:18Проверять надо при помощи
type less
(у меня fish, не помню, как в bash записывается, кажется так же) иless -V
.
DerRotBaron
11.09.2019 14:40И от шелла и не от шелла. В Fedora переменная LESSOPEN определяется на скрипт, выводящий в случае директории вывод ls.
Детали[user@localhost ~]$ rpm -ql less /etc/profile.d/less.csh /etc/profile.d/less.sh /usr/bin/less ... /usr/bin/lesspipe.sh ... [user@localhost ~]$ cat /etc/profile.d/less.sh # less initialization script (sh) # All less.*sh files should have the same semantics! if [ -z "$LESSOPEN" ] && [ -x /usr/bin/lesspipe.sh ]; then # The '||' here is intentional, see rhbz#1254837. export LESSOPEN="||/usr/bin/lesspipe.sh %s" fi [user@localhost ~]$ cat /usr/bin/lesspipe.sh #!/bin/sh ... # The script should return zero if the output was valid and non-zero # otherwise, so less could detect even a valid empty output # (for example while uncompressing gzipped empty file). # For backward-compatibility, this is not required by default. To turn # this functionality there should be another vertical bar (|) straight # after the first one in the LESSOPEN environment variable: # export LESSOPEN="||/usr/bin/lesspipe.sh %s" ... if [ -d "$1" ] ; then ls -alF -- "$1" exit $? fi ...
kashtan404
11.09.2019 10:10Я считаю, grep и stat незаслуженно забыли:
grep -l '.*' ./* stat ./*
027
11.09.2019 10:46stat незаслуженно забыли
stat дает чрезмерно говорливый выхлоп, а в задаче надо просто список файлов.
Тогда уж лучше file:
file ~/*
Но этот способ не показывает скрытые файлы (как и все иные, основанные на разворачивании звездочки интерпретатором). Может, как-то можно через переменные окружения на это повлиять?polar_yogi
11.09.2019 16:48Говорливость stat регулируется, можно выводить от только имени до хотя json какого нибудь.
Например:
stat -c "%A %G:%U %s %x %n" * \.*
Oxyd Автор
12.09.2019 04:35Ну говорливый. Говорилка-то угоманивается… ;-)
stat ~/* ~/.*|grep "/home"|awk '{print $2}
Stronix
11.09.2019 12:04echo -e «import os\nfor i in os.listdir(os.getenv('HOME')): print(i)» | python
Так аккуратнее, на мой взгляд:
python -c "import os; print(os.listdir('.'))"
RumataEstora
11.09.2019 13:14- echo и print
Эти команды не идентичны. Возможно Вы имели в виду printf, но она может сбоить в некоторых случаях, хотя echo — тоже.
- tar
У вас мешанина в примере — /dev/null и null.
- Perl
Нет нужды использовать последние фичи языка, но можно использовать внутренние возможности:
perl -le '$d = "."; opendir D, $d or die "Could not open $d for reading: $!\n"; print while (readdir D)'
И, кстати, вот еще один перловый ls:
perl -le 'print while <.* *>'
azmar
11.09.2019 14:59На случай если есть руби из коробки:
ruby -e 'puts Dir.entries "."'
027
11.09.2019 20:25На случай, если есть php в коробке.
Для текущей:php -r 'print_r(scandir("."));'
Для домашней:php -r 'print_r(scandir($argv[1]));' -- ~
Для всякой:php -r 'print_r(scandir($argv[1]));' -- <some_dir>
Zoro
11.09.2019 15:06+1ls -i /home
529589 test
debugfs /dev/sda1
debugfs: stat <529589>
Inode: 529589 Type: directory Mode: 0755 Flags: 0x80000
Generation: 2678704405 Version: 0x00000000:00000007
User: 1000 Group: 1000 Project: 0 Size: 4096
File ACL: 0
Links: 4 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5d721b09:c9c4305c — Fri Sep 6 08:38:33 2019
atime: 0x5d78e0f5:a027932c — Wed Sep 11 11:56:37 2019
mtime: 0x5d721b09:c9c4305c — Fri Sep 6 08:38:33 2019
crtime: 0x5d721abd:243d5800 — Fri Sep 6 08:37:17 2019
Size of extra inode fields: 32
Inode checksum: 0xa0aa0f22
EXTENTS:
(0):2106181
берем
(0):2106181
dd if=/dev/sda1 of=image.dd bs=4096 count=1 skip=2106181
hexdump -C image.dd | awk '{print $18}'
|................|
|................|
|.profile........|
|.bashrc.........|
|.bash_logout....|
|.....cache......|
|.....gnupg......|
|.....sudo_as_adm|
|in_successful...|
|................|
|............&..W|
:)
iig
11.09.2019 15:32+1stat *|awk '/File:/{print $2}'
Oxyd Автор
12.09.2019 05:03Хорошо, до той поры пока не наткнётся на русскую локаль… ;-) Ну или например китайскую.
POPSuL
12.09.2019 06:14LANG=C stat ...
никто не отменял :)027
12.09.2019 07:21О, кстати!
Кто объяснит, почему в подобных конструкциях после задания переменной не нужно ставить точку с запятой? Это же отдельная команда, по идее.POPSuL
12.09.2019 11:37Нет, это изменение environment variable для запускаемой программы, а не глобально. именно поэтому при "пайпинге" нужно указывать для каждой команды свои переменные окружения (ну, если нужно конечно), вроде
LANG=C stat . | LANG=C other-command
027
12.09.2019 11:40Спасибо. А не подскажете, где про это можно почитать? Это же не bash-специфичное поведение?
POPSuL
12.09.2019 12:32Это работает даже в
sh
.
Почитать об этом можно в разделе https://help.ubuntu.com/community/EnvironmentVariables#Bash.27s_quick_assignment_and_inheritance_trick
Ну и вообще, вся статья полезна.
simpleadmin
12.09.2019 14:09+1Это Bourne shell-совместимое поведение.
Не будет работать в C-shell'ах
Там потребуется выполнять env, set или setenv соответственно для изменения переменной окружения, установки сессионной переменной и экспорта переменной.eumorozov
12.09.2019 17:38И в fish тоже по другому работает:
env LANG=C ls
Я уже несколько лет как перешел с bash и zsh на fish. Не знаю откуда у меня такая настойчивость, первые года два ломало, а теперь втянулся и нравится.
bash — вообще считаю недоразумением. Сколько лет можно чинить теряющуюся историю?.. Эта проблема существует уже наверное не менее десятилетия. Миллионы хаков напридумано для костыльного исправления этой ошибки, вышел один или два мажорных релиза bash, а воз и ныне там...
027
13.09.2019 21:51Я уже несколько лет как перешел с bash и zsh на fish. Не знаю откуда у меня такая настойчивость, первые года два ломало, а теперь втянулся и нравится.
Два года? Похоже, эта ваша рыба заливная! :)eumorozov
15.09.2019 12:23Честно говоря, единственная вещь, которая напрягала эти два года — отсутствие
Ctrl-R
в fish. Точнее, неточная эмуляции этого механизма при помощиfzf
.
Когда работаешь с bash где-то с 1996 года, всякие bash'евские приемы работы начинают жить где-то уже в пальцах. Но два года оказалось достаточно, чтобы перебить старые привычки.
Все-такие fish — это какой-то шаг вперед. bash и zsh кажутся отставшими от времени и слишком эклектичными. PowerShell кажется наоборот очередным неудобным overengineering от Microsoft.
fish — этакий разумный компромисс между эклектичной олдфажностью и современностью.
027
12.09.2019 14:37Хм… А почему вот это не работает?
$ LANG=C echo $LANG ru_RU.UTF-8
$ LANG=C /bin/echo $LANG ru_RU.UTF-8
POPSuL
12.09.2019 14:46Потому что
$LANG
это переменная, которая уже объявлена, и при выполнении этой команды она "разворачивается" в значениеru_RU.UTF-8
.
upd: именно поэтому я и показал пример с getenv
027
12.09.2019 15:10Потому что $LANG это переменная, которая уже объявлена, и при выполнении этой команды она «разворачивается» в значение ru_RU.UTF-8.
Как же так? Я ее только что переопределил из 'ru_RU.UTF-8' в 'C'.
Почему-тоecho
это игнорирует, а вот, скажем,man, radeontop
используют значение 'C'.POPSuL
12.09.2019 15:17Потому-что в баше переменные "разворачиваются" в значение до запуска самой программы. По схожему принципу и работает glob, т.е. вы напишете
cat *
, но баш на самом деле сам прочитает содержимое директории, и выполнит что-то вродеcat a.txt b.txt c.txt somedir
.
Почемуradeontop
работает — я не знаю, возможно он работает совсем не так как вы ожидаете, и просто не замечаете это (я за зеленых, поэтому такие тулзы ни разу в жизни не использовал).
simpleadmin
12.09.2019 15:45+1Почему-то echo это игнорирует
Именно так, потому что echo не «интересуют» переменные окружения.
Пример
EDITOR=mcedit crontab -e
откроет cron в mcedit
EDITOR=vi crontab -e
откроет cron в vi
но
$ EDITOR=vi echo "one: [$EDITOR]"
one: []
echo просто пофиг на нашу переменную окружения.
Но мы можем задать её как переменную оболочки и ограничить область действия (Bourne shell-совместимое поведение):
$ (EDITOR=vi; echo "one: [$EDITOR"]); echo "two: [$EDITOR]"
one: [vi]
two: []
аналогично для запрашиваемого примера:
$ (LANG=C; /bin/echo $LANG); /bin/echo $LANG
C
en_US.UTF-8
027
12.09.2019 17:22Именно так, потому что echo не «интересуют» переменные окружения.
Я понял так, что модифицированные переменные окружения выдаются программе в виде копии и исключительно для нужд настройки поведения.
$LANG интерпретатор берет из текущего окружения для всего сеанса ( а echo тут вообще ничего не решает).
Если бы удалось заставить echo ругаться на что-либо, тогда модифицированное значение переменной LANG влияло бы на язык сообщений. Как это и происходит в моей системе с man, nmap и radeontop, которые обучены русскому.
Трюк, походу, не bash-специфичный — в dash переключение языка срабатывает.eumorozov
12.09.2019 17:43echo
— встроенная команда bash (builtin). То есть, при выполненииecho
не будет порожден новый процесс, в котором будет запущена программа/bin/echo
.
LANG=C
влияет на порожденные процессы. Например,LANG=C ls
приводит к порождению процесса запускающего/bin/ls
, и в этом процессе уже будет модифицированное окружение.027
12.09.2019 18:12echo — встроенная команда bash (builtin). То есть, при выполнении echo не будет порожден новый процесс, в котором будет запущена программа /bin/echo.
Я приводил в исходном каменте оба варианта, со встроенным эхом и с/bin/echo
. Поведение одинаковое.
встроенная команда bash… не будет порожден новый процесс
Вы это точно знаете или предполагаете?027
12.09.2019 18:19Кстати, подляна изрядная, эти одноименные встроенные команды. Когда не знаешь об этом, массу времени можно потерять, ругая ни в чем не повинного составителя мана утилиты.
eumorozov
12.09.2019 18:24Ах, да, прав комментатор про то, что bash подставляет значения переменных при вызове. Конечно, когда мы пишем
cmd $VAR
любой shell обязан подставить$VAR
до вызова команды.
Вы это точно знаете или предполагаете?
Конечно уверен. На то они и builtins, к чему тратить ресурсы системы на порождение нового процесса?..
Поэтому при отладке каких-то проблем со скриптами и т.п., что я делаю первым делом — запускаю
type ls
илиtype cat
и т.д., чтобы знать точно, что не имею дело с алиасом или командой, которая взялась не из стандартного пути.027
12.09.2019 18:30Конечно уверен. На то они и builtins, к чему тратить ресурсы системы на порождение нового процесса?..
Уверенность на основе рассуждения есть предположение. :) Ну да бог с ним. Дело тут совсем не в отдельности процесса.
Ах, да, прав комментатор про то, что bash подставляет значения переменных при вызове. Конечно, когда мы пишем cmd $VAR любой shell обязан подставить $VAR до вызова команды.
Отож! Он идет по строке справа налево, натыкается на $LANG, рожает указатель (наверное, я в сях не силен) и тупо скармливает его эху. До модифицированного одноразового окружения ему дела нет.
А внешне кажется, что это эхо игнорирует, зараза такая своенравная. :)eumorozov
12.09.2019 18:36Уверенность на основе рассуждения есть предположение. :) Ну да бог с ним. Дело тут совсем не в отдельности процесса.
Ну, если бы shell не использовал builtins, то, например, такая команда как
cd
не имела бы смысла: она бы меняла только текущий каталог порожденного процесса, и в shell не было бы никакой возможности перейти в другой каталог.
А так полагаю, что существует много нюансов. Когда-то я целиком читал документацию по bash. Но это было наверное 20 лет назад, и много мелких нюансов я уже забыл. Возможно, для каких-то команд builtins используются только в интерактивном режиме. Беглый просмотр
man bash
по диагонали не дал подтверждения, надо внимательно читать его целиком, а он огромный.
027
12.09.2019 18:36запускаю type ls или type cat и т.д., чтобы знать точно, что не имею дело с алиасом или командой, которая взялась не из стандартного пути.
Кстати, есть оч. полезная команда в баше:compgen -c will list all the commands you could run. compgen -a will list all the aliases you could run. compgen -b will list all the built-ins you could run. compgen -k will list all the keywords you could run. compgen -A function will list all the functions you could run. compgen -A function -abck will list all the above in one go.
В частности, вот так можно отловить дублирующуюся команду:
$ compgen -c | grep -E '^time$' time time
Попалась, зараза!simpleadmin
12.09.2019 21:29$ type -a time time is a shell keyword time is /usr/bin/time
027
12.09.2019 21:31О!
Сенькс.
Неисчислимы заковыристые ходы, придуманные в те давние времена, когда компьютеры были большими, а сообщество маленьким.
Множество частных, подробно ориентированных штучек-дрючек, и никто не ведал, что скоро придет диавол под личиной multimedia, и пожрет все, до чего дотянется мягкими, липкими, необъятными в своих слоях абстракций лапищами…
MaxVetrov
12.09.2019 18:25у меня echo — файл в bin
eumorozov
12.09.2019 18:29Да, она есть во всех системах из каких-то соображений. Полагаю, чтобы в пользовательских программах не ломался код типа:
system("echo Hello world")
.
Но в shell запустится builtin.
/bin/echo
запустится, только если писать полный путь:/bin/echo Hello world
.027
12.09.2019 18:43Да, она есть во всех системах из каких-то соображений. Полагаю, чтобы в пользовательских программах не ломался код типа:
system("echo Hello world")
.
Если в путях есть/bin
ничего не сломается. А так должно быть обязательно. Ну, если это не наколенная эмбедовка от васяна, понятно.
Соображения я встечал такое: большее быстродействие и меньший жор. Вызов внешней утилиты в любом случае накладно. К тому же встроенные нередко более убогие и потому скоростные.
MaxVetrov
12.09.2019 19:27Действительно ,)
Для printf, kill, pwd, test — тоже самое.
Команды делаются встроенными либо из соображений производительности — встроенные команды исполняются быстрее, чем внешние, которые, как правило, запускаются в дочернем процессе, либо из-за необходимости прямого доступа к внутренним структурам командного интерпретатора.
027
12.09.2019 18:48у меня echo — файл в bin
У меня и то, и другое:
$ compgen -c | grep -E '^echo$' echo echo $ which echo /bin/echo $ type echo echo — это встроенная команда bash
MaxVetrov
12.09.2019 20:27возможно, было бы удобно их с индексом запускать:
echo[0]
echo[1]027
12.09.2019 20:31Это как?
MaxVetrov
12.09.2019 23:54Я имею ввиду, если бы баш позволял.
[0] — внутренняя
[1] — внешняя
Ключевое слово — возможно.
Хотя есть команда command -peumorozov
13.09.2019 06:40Shell и так позволяет запускать любой вариант, было бы странно иначе.
Простоecho
— запускает builtin./bin/echo
запускает/bin/echo
.
Если кто-то или что-то переопределило
echo
, тоbuiltin echo
явно запустит builtin.
klirichek
11.09.2019 19:57+1Очень простая, но реальная задача:
веб-камера с записью "сошла с ума" и вместо записи по движению скинула на флэшку непрерывную запись целой недели. ~20 тыс. файлов. ФС fat32.
ls
(просто) в папке DCIM ничего не выводит (думает минут 5, потом убивается системой).
И вот тут выясняется, что ls написан внутри очень неплохо! Он не получает "список всего", а потом накладывает фильтр, а сразу фильтрует при выводе на экран. В итоге ls "20190901*" и т.д. вполне сработали! (последующий rm так же сработал по тому же паттерну)alhimik45
11.09.2019 21:45Только это не ls и rm такие крутые, а шелл, который развернул имя со звездочкой в список файлов и уже их передал списком аргументов (и тут кстати можно словить ошибку, если файлов больше, чем максимально разрешенное число аргументов командной строки)
catharsis
12.09.2019 03:52Известная проблема с многими ФС, да:
Как удалить миллионы файлов из одной папки
Так как же удалить миллионы файлов из одной папки
Cheater
11.09.2019 19:59+1Даём команду на интерактивное удаление /home/username (rm -i), и генерируем для неё "интерактивный" ответ сначала из одного "y" (для подтверждения рекурсивного спуска в ~), и затем в цикле "n" (для отказа рекурсивного спуска на более нижние уровни и отказа удаления):
(echo y; yes n) | rm -ir ~
Улучшенный вариант с последующей чисткой лога от ненужного текста:
(echo y; yes n) | rm -ir ~ 2>&1 | sed -E -e "s/(rm:[^']+)|\?//g"
Uzix
11.09.2019 22:57Для FreeBSD:
cat ~ |strings |xargs -IX sh -c 'test -e X && echo X'
Но не работает с каталогами и файлами, содержащими в имени перевод строки.
gudvinr
12.09.2019 02:05python -m http.server > /dev/null & export PID=$(echo $!) && sleep 1 && curl -s localhost:8000/ | grep -Po '(?<=href=")[^"]*' && kill $PID
Если вы оказались в сложной жизненной ситуации и у вас есть только Go:
cat <<EOF | tee /tmp/habr.go | go run /tmp/habr.go package main; import ("fmt"; "path/filepath"); func main() {f,_ := filepath.Glob("*"); fmt.Println(f)} EOF
Аналогично, для поклонников современного C++:
cat <<EOF | c++ -x c++ --std=c++17 -o /tmp/habr - && /tmp/habr #include <iostream> #include <filesystem> using namespace std; int main() { for (auto e : filesystem::directory_iterator(".")) cout<<e.path()<<endl; } EOF
ne_zabudka
12.09.2019 11:21справедливо для gawk
(shopt -s dotglob; awk -lreaddir 'ENDFILE {print FILENAME}' *)
MaxVetrov
13.09.2019 02:53mc ranger exa
wc -c * size * cksum * crc32 * sha1sum * md5sum * sum *
Осторожно .)
chmod -v -x * chown -v <user> * strip -v *
m03r
cd ~; vi .
(zsh)
~/ [tab][tab]
SlavniyTeo
[tab][tab] — слишком интерактивно
К сожалению, выведет пару лишних строк.