разница между копией содержимого папки /. и / * в linux

По умолчанию вы можете переключать "состояние масштабирования" панели, нажимая Префикс и z (по умолчанию префикс Ctrl + B ).

Это заставит текущую панель (например, панель командной строки) занять все окно. Снова нажмите Префикс и z , чтобы «уменьшить масштаб» панели.

8
24.07.2017, 03:46
2 ответа

Существует фундаментальное различие между этими двумя формами аргументации. И очень важно понимать, что происходит.

С помощью ../foldersource/.аргумент передается команде без изменений, будь то cpили rmили что-то еще. От команды зависит, имеет ли эта конечная точка особую или уникальную семантику, отличную от стандартного соглашения Unix о простом указании на каталог, в котором она находится; и в rm, и в cpэто, по-видимому, рассматривается как частный случай.

С помощью ../foldersource/*аргумент сначала раскрывается оболочкой , прежде чем команда вообще будет выполнена и переданы какие-либо аргументы. Таким образом, rmникогда не видит ../foldersource/*; он видит расширенную версию ../foldersource/file1.ext../foldersource/file2.ext../foldersource/childfolder1и так далее. Это важно, поскольку операционные системы ограничивают количество аргументов, которые можно передать команде, обычно всего несколько сотен.

10
27.01.2020, 20:08

Когда вы копируете с помощью cp -a source/* target/, вы копируете большинство файлов и каталогов из sourceв target. В частности, исключаемые элементы, вероятно, будут файлами, начинающимися с точки(.)на верхнем уровне source.

Рассмотрим эти файлы (или каталоги )вsource

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will not be copied

При копировании с помощью cp -a source/. target/вы копируете все содержимое source, включая все элементы, начинающиеся с точки (.)–target

.

Рассмотрим эти файлы (или каталоги )вsource

apple        # will be copied
banana/      # will be copied, as will all its contents
.cherry      # will be copied

Если вы используете bash, zsh, вы можете использовать параметрdotglob, чтобы изменить значение *, чтобы оно также включало файлы и каталоги, начинающиеся с точки (yash. имеет опцию dotglob; однако затем он включает .и ..в расширения глобуса, что ограничивает его использование. См. также FIGNORE='@(.|..)'в ksh93).

Интересно, что cp -a source/. target/гарантируется никогда создание компонента target/source. (С другой стороны,cp -a source target/выполнит одно из двух действий в зависимости от того, существует ли уже target. Подробности см. в Как рекурсивно скопировать папку идемпотентным способом с помощью cp .)


Когда вы удаляете с помощью rm -rf source/*, вы удаляете файлы и каталоги в source, которые не начинаются с точки(.). С учетом уже упомянутой настройки dotglob. Он не удалит сам каталог source.

При попытке удалить с помощью rm -rf source/.произойдет сбой -, поскольку другие уже объяснили -, поскольку POSIX запрещает удаление пути, последним компонентом которого является .или ... Ближайшим эквивалентом является rm -rf source, который удалит каталог sourceи все его содержимое независимо от того, начинаются ли они с точки (.).

10
27.01.2020, 20:08

Теги

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