for file in *; do
echo "$file"
done
Это обычно не соответствует «скрытым» файлам (имена, начинающиеся с точки), хотя.
Для сопоставления скрытых файлов вам также нужно это раньше:
shopt -s dotglob
Если вы хотите пропустить каталоги (и, возможно, что-нибудь «странное»), вы должны обнаружить их в цикле; Соответствие образцам ( *
) не заботится о типе объекта:
for file in *; do
test -f "$file" || continue
echo "$file"
done
Символические ссылки - это особый случай. Они считаются, если они ссылаются на файл, но файл может быть в другом каталоге. Чтобы игнорировать симлизы:
for file in *; do
test -f "$file" || continue
test -L "$file" && continue
echo "$file"
done
Обычно (всегда?) vi является просто ссылкой на vim. В моей системе (OpenSuSE )/bin/vi является просто символической ссылкой на/bin/vim. Так что если вы просто уберете их обоих, это должно исчезнуть. Но, как спрашивали другие, зачем вам это делать на земле?
-121--209946- Используйте openvt
. Обратите внимание, что вы должны быть root, поскольку оконечные устройства принадлежат root, если пользователь не вошел в систему.
openvt -c 8 myapp
Добавьте параметр -s
, если требуется переключиться на vt 8 при выполнении команды openvt
.
... вы также обнаружите, что *. *
это то же самое, что и *
само по себе.
Кроме того... при вводе DIR .TXT
командная строка действовала так же, как при вводе DIR * .TXT
... Возможно, такое поведение... не намеренно, но это был несчастный случай, на который некоторые люди пришли положиться. Когда мы исправили ошибку в Windows 95, несколько человек пожаловались, что их команда DIR .TXT
не работает.
Алгоритм сопоставления FCB был отменен во время перехода к Win32 , поскольку он не работал с длинными именами файлов. Длинные имена файлов могут содержать несколько точек, и, конечно, файлы могут быть длиннее одиннадцати символов, а перед точкой может быть больше восьми символов. Но некоторые проблемы алгоритма сопоставления FCB сохраняются в Win32 , потому что они стали идиомами.
Например, если образец заканчивается на . *
, . *
игнорируется. Без этого правила образца *. *
совпадали бы только с файлами, которые содержали точку, что нарушало бы, вероятно, 90% все пакетные файлы на планете, а также с памятью всех мускулов, поскольку все работающие под управлением Windows NT 3,1 выросли в мире, где *. *
имели в виду все файлы.
В качестве другого примера, образца, который заканчивается точкой, фактически не соответствует файлам, которые заканчиваются точкой; он соответствует файлам без расширения. И вопросительный знак может совпадать с нулевыми символами, если он приходит непосредственно перед точкой.
Давно, по мере разработки дизайна файловой системы Unix , записи .
и .. Появился
, чтобы облегчить навигацию. Я не уверен, но я верю ..
вошел во время перезаписи версии 2, когда файловая система стала иерархической (на ранних этапах она имела совершенно другую структуру) . При вводе ls
, однако, появились эти файлы, поэтому либо Кен, либо Деннис добавили в программу простой тест. Тогда это было в ассемблере, но рассматриваемый код был эквивалентен чему-то подобному:
if (name[0] == '.') continue;
Это утверждение было немного короче, чем должно было быть, то есть
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
... но эй, это было легко...
Я почти уверен, что концепция скрытого файла была непредвиденным последствием. Это была ошибка.
(Для тех, кто возражает, что точечные файлы служат цели, я не оспариваю это, но против того, что это файлы, которые служат цели, а не соглашение для их имен. Они также легко могут быть в $ HOME/cfg
или $ HOME/lib
, что мы сделали в Plan 9 , который не имел файлов с точками. Уроки можно извлечь.)
Since затем, однако, .
Файлы точек были связаны со стандартной оболочкой . утилита
, а оттуда только с пользовательскими файлами конфигурации в виде обычного текста.
Обычно вы не найдете точечных файлов где-либо, кроме ~
пользователя, потому что это действительно единственное место, где они имели бы смысл - пользователь не должен хранить ни один из своих файлов где-либо еще в файловой системе, в любом случае. При работе с файлами в домашнем каталоге было бы жаль, если бы пользователь случайно удалил некоторые или все их файлы конфигурации - но было бы еще более жаль, если бы - в ~
или любом другом каталоге - цикл непреднамеренно повлиял на .
- текущий каталог - или (еще хуже) ..
- родительский каталог. POSIX имеет это сказать о .
:
Если имя файла начинается с точки .
, точка должна быть явно сопоставлена с использованием точки в качестве первого символа образца или непосредственно после символа /
косой черты. Ведущий период не должен соответствовать:
*
звездочка или ?
вопросительный знак специальные знаки
А [
скобка ]
выражение, содержащее не соответствующий список, такой как [! a]
, выражение диапазона, такой как » [%-0]»
, или выражение класса характера, такой как [[: punct:]]
[.abc]
, соответствовать ведущему периоду в имени файла. Однако все файлы в текущем каталоге - файлы с точками или нет - можно закольцовывать в одном цикле достаточно просто. Например:
set -- .* *
while until [ -f "$1" ] ||
[ -z "$1" ] &&
break "$((!$#+1))"
do shift; done
do printf %s\\n "$1"
shift
done
Все обычные файлы в текущем каталоге печатаются в тире
, bash
, ksh
, zsh
, mksh
, posh
и yash
. Это даже более сродни циклу Windows FOR
, чем типичная оболочка для
, так как она не устанавливает никаких постоянных переменных оболочки - так же, как cmd
FOR
она обрабатывает свои аргументы и когда она проходит с ними их имена больше не имеют никакого значения.В типичной оболочке для
последнее значение в $ var
в для var в...
остается.
У него нет , чтобы быть таким:
set -- .* * ''
while [ -n "$1" ] || ! shift
do [ -f "$1" ] &&
set -- "$@" "$1"
shift
done
printf %s\\n "$@"
... достигает той же цели так же заметно - печать всех обычных файлов в текущем каталоге - но он петляет по аргументам один раз и отсекает те, которые не являются обычными файлами. Преимущество, однако, заключается в том, что впоследствии массив arg «$ @»
оболочки по-прежнему содержит весь список, и из этого пункта можно сделать:
for f do : something w/ "$f"; done
... столько раз, сколько угодно на одном и том же массиве. Но вы также получите подсчет в «$ #»
и все аргументы, связанные в один ряд в «$ *»
и каждый адресуемый отдельно в порядке сортировки в «$1»
... «$ {10}»
и т.д.
Это, как правило - не вид вещей, вы можете сделать w/Win32 cmd
.
Если вам интересно для обучения петли
синтаксис -
for i in $(command with iterable elements); do command $i; done
вроде -
for i in $(echo 1 2 3 4 5); do echo $i; done
Если вам интересно в команде поиска -
find . -name "*"
с уровнем глубины -
find . -maxdepth 1 -name "*"
find . -maxdepth 2 -name "*"
, может быть, это более полезно для вас