Чтобы упростить мое объяснение, я не буду говорить о скрытых файлах.
Потому что ваша команда не означает, чего вы пытаетесь достичь.
* Очень особенный для bash и не имеет значения, которое вы думаете. Это символ, который оболочка заменит всеми именами файлов, которые он может соответствовать в текущем каталоге. Пример:
[email protected]:~/foo$ ls
[email protected]:~/foo$ touch foo
[email protected]:~/foo$ ls
foo
[email protected]:~/foo$ ls | grep *
foo
% выше эквивалентно $ ls | grep foo
[email protected]:~/foo$ touch bar
[email protected]:~/foo$ ls | grep *
% выше эквивалентно $ ls | grep bar foo
, он будет выводить что-то, если слово «бар» находится В в файл foo.
См там пример с большим количеством файлов:
[email protected]:~/foo$ touch bar foo foobar
[email protected]:~/foo$ echo "bar" > foo
[email protected]:~/foo$ echo "bar" > foobar
[email protected]:~/foo$ ls | grep *
foo:bar
foobar:bar
Теперь, чтобы сделать то, что вы хотите достичь, вы можете использовать * в свою пользу:
[email protected]:~/foo$ ls foo*
foo foobar
Но если это каталог, который соответствует вашему исследованию, он перечислит его содержимое.
[email protected]:~/foo$ mkdir foodir
[email protected]:~/foo$ for i in {0..10}; do touch "foodir/$i"; done
[email protected]:~/foo$ ls foo*
foo foobar
foodir:
0 1 10 2 3 4 5 6 7 8 9
Таким образом, вы можете использовать опцию не -d, чтобы перечислить их содержание:
[email protected]:~/foo$ ls -d foo*
foo foobar foodir
Но если ваш поиск становится все более сложным, я могу только совет использовать более мощный инструмент, как найти.
Это один использует подстановку (* я объяснил выше)
[email protected]:~/foo$ find . -type f -name "foo*"
./foo
./foobar
Это один использует регулярное выражение, но это инструмент, который вам нужно изучить немного, чтобы быть в состоянии справиться без потери волос:
[email protected]:~/foo$ find . -type f -regex ".*/foo[^/]*$"
./foo
./foobar
Чтобы объяснить немного, выше поиск текущего каталога (.) для файлов только (типа F), которые соответствуют определенному шаблону (-regex "/Foo [^ /] $").
Этот шаблон «все, за которым следует slash foo, за которым следует что-либо, кроме слэша, до конца файла».
Поскольку оболочка расширяет '*'. Если вы хотите получить список всех файлов, начинающихся с «complex *», которые будут 'ls complex *'. –
Вставьте 'echo', чтобы узнать, что делает bash с вашей второй командой:' ls | echo grep * ' – Cyrus
Хуже того, если файл' complex_assignment_other.c' содержит строку с фразой 'complex_assignment.c', (например,' // эта функция определена в файле complex_assignment.c'), эта строка будет напечатана на терминале. – anishsane