2017-02-09 20 views
0

Почему не rm -fR folderpath/* удалите путь к папке. Как я понимаю, подстановочный знак a* означает a или a плюс любое количество символов. Таким образом, folderpath/* означает folderpath/ и folderpath/ plus любой символ. Таким образом, команда также должна выполнить rm -fR folderpath/, что также приведет к удалению пути к папке.Использование подстановочных знаков, таких как путь к папке/*, не соответствует pathpath /. Зачем?

+0

Подстановочный знак в этом случае является «shell globbing», где '*' соответствует чему-либо, _but не ** ничего ** _ - это не похоже на '*' в регулярных выражениях, которые соответствуют «нулю или более» ... shell glob '*' не соответствует _zero_. –

+0

Расширение имени пути несколько отличается от сопоставления с образцом. – chepner

+1

@StephenP Это не совсем так. 'foo * bar' будет соответствовать' foobar'. – chepner

ответ

0

Потому что вы только удаляете то, что находится внутри пути к папке «/».

Использование

rm -rf folderpath 

, если вы хотите, чтобы все это исчезло.

+0

Я знаю это. Просто хочу знать почему? Потому что rm -fR folderpath/удаляет всю папку. Почему wild card ведет себя по-разному для rm? – christoph

1

Это происходит из-за того, что оболочка пытается расширить свои подстановочные знаки. Попробуйте с ls.

Предполагая, что у вас есть папка aaa с двумя подпапок bbb1 и и каждый из них содержит файлы ccc1 и ccc2. Посмотрел бы, как это:

└── aaa 
    ├── bbb1 
    │   ├── ccc1 
    │   └── ccc2 
    └── bbb2 
     ├── ccc1 
     └── ccc2 

Давайте создадим их для тестирования:

mkdir -p aaa/bbb{1,2} 
touch aaa/bbb{1,2}/ccc{1,2} 

Теперь попробуйте то, что следующие команды показывают вам:

ls aaa  # first 
ls aaa/  # second 
ls aaa/*  # third 

Первая команда показывает содержимое aaa , которые представляют собой папки bbb1 и . Вторая команда делает то же самое.

Но третья команда расширяется до

ls aaa/bbb1 aaa/bbb2 

Да, и это показывает, вы, как ожидается, содержание bbb1 и , которые оба раза файлы ccc1 и ccc2.

То, что я хотел показать: Ваша оболочка заменяет * со всех файлов (или папок) в , что данный каталог (потому что все файлы и имена папок совпадают) и заменяет строку aaa/* на aaa/bbb1 aaa/bbb2. Но это не развернуть до aaa, потому что это займет /*.

1

Документация на данном этапе не ясна, но расширение пути несколько отличается от обычного сопоставления с образцом. После того, как вы сопоставите /, вы должны сопоставить хотя бы одну запись в каталоге, прежде чем шаблон в целом будет считаться совпадающим. Поэтому, хотя шаблон /foo/* будет соответствовать строке /foo/, он не соответствует методу /foo/.

Одна из возможных интерпретаций является то, что /foo/* сопрягает файлы в /foo/, и если нет файлов, матч не удается.Я хотел бы эту интерпретацию лучше, хотя, если

shopt -s dotglob 
ls /foo/* 

соответствует /foo/. и /foo/...

Возможно, правильный способ думать об этом является то, что расширение путь считает / -delimited последовательность шаблонов, каждый из которых должен соответствовать что-то для картины в целом, чтобы соответствовать.