Почему не rm -fR folderpath/*
удалите путь к папке. Как я понимаю, подстановочный знак a*
означает a
или a
плюс любое количество символов. Таким образом, folderpath/*
означает folderpath/
и folderpath/
plus любой символ. Таким образом, команда также должна выполнить rm -fR folderpath/
, что также приведет к удалению пути к папке.Использование подстановочных знаков, таких как путь к папке/*, не соответствует pathpath /. Зачем?
Использование подстановочных знаков, таких как путь к папке/*, не соответствует pathpath /. Зачем?
ответ
Потому что вы только удаляете то, что находится внутри пути к папке «/».
Использование
rm -rf folderpath
, если вы хотите, чтобы все это исчезло.
Я знаю это. Просто хочу знать почему? Потому что rm -fR folderpath/удаляет всю папку. Почему wild card ведет себя по-разному для rm? – christoph
Это происходит из-за того, что оболочка пытается расширить свои подстановочные знаки. Попробуйте с 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
, потому что это займет /*
.
Документация на данном этапе не ясна, но расширение пути несколько отличается от обычного сопоставления с образцом. После того, как вы сопоставите /
, вы должны сопоставить хотя бы одну запись в каталоге, прежде чем шаблон в целом будет считаться совпадающим. Поэтому, хотя шаблон /foo/*
будет соответствовать строке /foo/
, он не соответствует методу /foo/
.
Одна из возможных интерпретаций является то, что /foo/*
сопрягает файлы в /foo/
, и если нет файлов, матч не удается.Я хотел бы эту интерпретацию лучше, хотя, если
shopt -s dotglob
ls /foo/*
соответствует /foo/.
и /foo/..
.
Возможно, правильный способ думать об этом является то, что расширение путь считает /
-delimited последовательность шаблонов, каждый из которых должен соответствовать что-то для картины в целом, чтобы соответствовать.
Подстановочный знак в этом случае является «shell globbing», где '*' соответствует чему-либо, _but не ** ничего ** _ - это не похоже на '*' в регулярных выражениях, которые соответствуют «нулю или более» ... shell glob '*' не соответствует _zero_. –
Расширение имени пути несколько отличается от сопоставления с образцом. – chepner
@StephenP Это не совсем так. 'foo * bar' будет соответствовать' foobar'. – chepner