Эквивалент cmd “для” в ударе?

[116356] Лучше использовать [116837] время [116838].


Например

1
21.08.2018, 05:55
3 ответа
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
5
27.01.2020, 23:17

Обычно (всегда?) vi является просто ссылкой на vim. В моей системе (OpenSuSE )/bin/vi является просто символической ссылкой на/bin/vim. Так что если вы просто уберете их обоих, это должно исчезнуть. Но, как спрашивали другие, зачем вам это делать на земле?

-121--209946-

Используйте openvt . Обратите внимание, что вы должны быть root, поскольку оконечные устройства принадлежат root, если пользователь не вошел в систему.

openvt -c 8 myapp

Добавьте параметр -s , если требуется переключиться на vt 8 при выполнении команды openvt .

-121--133583-

Описываемое вами поведение соответствия образца - согласно этому блогу technet - дедушка-жучок:


... вы также обнаружите, что *. * это то же самое, что и * само по себе.

Кроме того... при вводе DIR .TXT командная строка действовала так же, как при вводе DIR * .TXT ... Возможно, такое поведение... не намеренно, но это был несчастный случай, на который некоторые люди пришли положиться. Когда мы исправили ошибку в Windows 95, несколько человек пожаловались, что их команда DIR .TXT не работает.

Алгоритм сопоставления FCB был отменен во время перехода к Win32 , поскольку он не работал с длинными именами файлов. Длинные имена файлов могут содержать несколько точек, и, конечно, файлы могут быть длиннее одиннадцати символов, а перед точкой может быть больше восьми символов. Но некоторые проблемы алгоритма сопоставления FCB сохраняются в Win32 , потому что они стали идиомами.

Например, если образец заканчивается на . * , . * игнорируется. Без этого правила образца *. * совпадали бы только с файлами, которые содержали точку, что нарушало бы, вероятно, 90% все пакетные файлы на планете, а также с памятью всех мускулов, поскольку все работающие под управлением Windows NT 3,1 выросли в мире, где *. * имели в виду все файлы.

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


Это не может слишком сильно отличаться от происхождения Unix-прецедента для точечных файлов, как отмечает Роб Пайк в своем блоге:


Давно, по мере разработки дизайна файловой системы Unix , записи . и .. Появился , чтобы облегчить навигацию. Я не уверен, но я верю .. вошел во время перезаписи версии 2, когда файловая система стала иерархической (на ранних этапах она имела совершенно другую структуру) . При вводе ls , однако, появились эти файлы, поэтому либо Кен, либо Деннис добавили в программу простой тест. Тогда это было в ассемблере, но рассматриваемый код был эквивалентен чему-то подобному:

if (name[0] == '.') continue;

Это утверждение было немного короче, чем должно было быть, то есть

if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;

... но эй, это было легко...

Я почти уверен, что концепция скрытого файла была непредвиденным последствием. Это была ошибка.

(Для тех, кто возражает, что точечные файлы служат цели, я не оспариваю это, но против того, что это файлы, которые служат цели, а не соглашение для их имен. Они также легко могут быть в $ HOME/cfg или $ HOME/lib , что мы сделали в Plan 9 , который не имел файлов с точками. Уроки можно извлечь.) 


Since затем, однако, . Файлы точек были связаны со стандартной оболочкой . утилита , а оттуда только с пользовательскими файлами конфигурации в виде обычного текста.

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


Если имя файла начинается с точки . , точка должна быть явно сопоставлена с использованием точки в качестве первого символа образца или непосредственно после символа / косой черты. Ведущий период не должен соответствовать:

  1. * звездочка или ? вопросительный знак специальные знаки

  2. А [ скобка ] выражение, содержащее не соответствующий список, такой как [! 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.

1
27.01.2020, 23:17

Если вам интересно для обучения петли

синтаксис -

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 "*"

, может быть, это более полезно для вас

-1
27.01.2020, 23:17

Теги

Похожие вопросы