2010-03-31 5 views

ответ

5

с Баш, вы можете использовать GLOBIGNORE

$ ls -1tra 
.. 
.test1 
.test 
test 
. 

$ for i in .*; do echo $i;done 
. 
.. 
.test 
.test1 

$ GLOBIGNORE=".:.." 
$ for i in .*; do echo $i;done 
.test 
.test1 
+0

Отлично :) спасибо – theosp

+0

Это, наверное, самый легкий для скрипта - для чего-то более легкого в использовании здесь и там в командной строке, см. Мой ответ. 'extglob' довольно удобен. – Cascabel

+0

Чтобы действительно ответить на вопрос, он должен быть: GLOBIGNORE = "* /.: */.." (для работы за пределами текущей $ PWD) – theosp

3

Используйте шаблон .{[^.]*,.?*}, что означает любое имя, которое начинается с . за которым следует символ, который не является ., или имя, которое начинается с .. за которым следует символ.

Также вы должны написать "$file" в кавычках, чтобы имена с пробелами не разваливались.

+1

Это не сработает, если по какой-то странной причине есть файл, который начинается с двумя периодами. –

+0

Я немного изменил вопрос, на этот раз есть файл, который начинается с ... – theosp

+0

@Ignacio D'oh! Исправлена. –

0
for file in x/.*; do echo "$file "; done | grep -v "x/\.\{1,2\} $" | tr -d '\n' 

Пространство после $file и перед $ в grep имеют важное значение. Он гарантирует, что у вас есть пробелы между списками и что все не сработало.

или более обобщенно

for file in somedir/.*; do echo "$file "; done | grep -v "\w/\.\{1,2\} $" | tr -d '\n' 
0

Использование ls -A на Mac OS X. Проверьте страницу человека для реализации местных вариантов. Эта команда

ls -A | grep '^\.' 

Дал мне список, который вы ищете.

+2

Я предпочитаю не использовать ls http://mywiki.wooledge.org/ParsingLs – theosp

+0

'ls -A' является стандартным. –

1

В качестве другой указал, ls -A не включает. и .. из листинга, не уверен, насколько это стандартно.

Вы также можете использовать найти:

find . -mindepth 1 -maxdepth 1 -name '.*' 
+1

'ls -A' является стандартным, но решение с' find' лучше (особенно если вы соединяете его с 'xargs' или' -exec'). –

1

решение с только универсализации, так что вы не должны беспокоить с подстановкой команд и:

.!(.|) 

Это требование эс вариант extglob оболочки необходимо установить:

shopt -s extglob 

Это, вероятно, очевидно, но !() конструкция означает, что ничего, кроме одной из моделей, перечисленных (разграниченных |).

+0

Спасибо, в зависимости от ситуации, я, вероятно, тоже воспользуюсь этим. - Если бы я мог выбрать два принятых ответа ... – theosp

0

(1) Используйте 2 рисунка: $ echo x /.* * x /.[^.] - есть другие комбинации. Если вы используете другой, убедитесь, что он уловит «...» и «.a»

(2) Используйте GLOBIGNORE и исключаем 2 записи: $ GLOBIGNORE = '*.. * * ; echo x /.*

(3) Используйте dotglob с GLOBIGNORE. Это автоматически исключает. и .., но теперь вы должны исключить «все остальное»: $ shopt -s dotglob; GLOBIGNORE = '*/[^.] * '; эхо х/*

0

для файла х /.{[^.],.?}*

Это будет соответствовать, например, .а .zoo.17 ... ..0 ..hello

, но не будет соответствовать . .. файлы-не-начиная с-точек

разбив его ...

на {а, Ь} делает чередование, первое сопрягать, то соответствующий б. Таким образом, мы могли бы также написать выше, как так:

для файла в х /.[^.]* х /..?*

Итак, давайте рассмотрим первый:. [. ^] * код [ ^.] - это инвертированный класс символов - без карат он будет соответствовать только точке;^инвертирует его так, чтобы он соответствовал любому символу, кроме точки. После этого есть звезда, которая будет соответствовать 0 или более символам любого типа Итак, этот шаблон. [^.] * Будет соответствовать файлам с именами, которые - начните с. - не менее двух символов - второй символ не является. Из приведенных выше примеров, это соответствует: .а .zoo.17

Теперь давайте рассмотрим второй: .. * The? соответствует любому символу (но не 0 символов). Мы знакомы со звездой. ? Так что этот рисунок .. * будет соответствовать файлы с именами, которые - начинаются с .. - по крайней мере, три символов Из приведенных выше примеров, это соответствует: ... ..0 ..hello

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

0

Другим вариантом является сохранить глобирование простых и явным образом удалить нежелательные пути:

for file in x/.* ; do 
    [[ $file == */. || $file == */.. ]] && continue 
    echo -n "$file " 
done 

 Смежные вопросы

  • Нет связанных вопросов^_^