Я перемещаю свой домашний каталог из старой системы в новую, и созданный мной архив содержит все, включая скрытые файлы, такие как .bashrc. Однако, когда я перемещаю содержимое распакованного архива (которое находится в / tmp) в мой новый домашний каталог, скрытые файлы не копируются ( mv /tmp/home/rcook/* /home/rcook/
). Как я могу заставить М.В. переместить их?
На самом деле, я думаю, что проблема не в mv, а в том, что bash работает. Если я сделаю это:
mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/
Я вижу это:
a/:
. .. .foo
b/:
. .. bar
a/.foo
не двигался. Итак, как мне получить * подстановочный знак для поиска скрытых файлов?
Да, я полагаю, что могу распаковать архив непосредственно в свой домашний каталог, но он распаковывается в архив home/rcook/...
, и я хочу быть уверен, что я перезаписываю новые .bashrc
и т. Д. Старыми, настроенными версиями и знаю, как найти и переместить скрытые файлы это стоящее умение. Предложения?
Некоторые ответы предлагают сделать что-то вроде mv src/.* dest/
. Однако я попробовал это в моих тестовых каталогах и получил ошибки. Начиная с:
rcook$ ls -a a/ b/
a/:
. .. bar .foo
b/:
. ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
. .. bar
b/:
. .. .foo
Что я делаю неправильно?
источник
Ответы:
Ты можешь сделать это :
Вы можете положить
в вашем,
~/.bashrc
если вы хотите, чтобы он был по умолчанию.Смотрите http://mywiki.wooledge.org/glob
Другой подход к копированию файлов точек:
Не используйте шаблон,
..*
как он соответствует..
(указатель на родительский каталог). Если есть файлы, имена которых начинаются с двух точек (..something
), также используйте шаблон..?*
.источник
.
и..
это специальные каталоги: соответственно текущий каталог и родительский каталог . Это просто предупреждение. Лучше использоватьshopt -s dotglob
решениеmv home/rcook/* /home/rcook/
затемmv home/rcook/.* /home/rcook/
. Это сработало, хотя хотелось бы перейти по ссылке и сначала прочитать о режиме dotglob. Это спасло бы меня на шаг. +1zsh
, вы можете использовать вD
подстановку спецификатора или вGLOB_DOTS
опции оболочки .В ваших дополнениях вы получили ошибки, но код все еще работал. Единственное, что нужно добавить, это то, что вы сказали только копировать точечные файлы. Пытаться:
Вы все равно получите ошибки для. и .. записи, что хорошо. Но этот шаг должен быть успешным.
источник
.hidden
решил переместить один файл, который у меня был явно, чтобы решить мою проблему.|| :
(||
означает выполнить следующее при false / error,:
команда noop). Но это также подавляет допустимые ошибки, например, папка назначения не существует. Я не могу найти более изящный способ , используяmv
чтобы исключить.
и..
запись. Большой плюс для меня по сравнению с cp - это не запись новых файлов на диск.Если вы
ls -l
в каталоге, вы увидите.
и..
среди перечисленных файлов. Итак, я думаю, чтоmv .* /dest
эти указатели учитываются. Пытаться:это будет игнорировать эти текущие и родительские указатели dir.
Вы получите сообщение об ошибке , если любой из трех моделей
*
,[^.]*
или..?*
не соответствует ни один файл, так что вы должны включать в себя только те , которые соответствуют.источник
Два возможных решения, которые я могу придумать. Первое - вместо этого использовать cp с его рекурсивной опцией, копируя текущий каталог в место назначения.
тогда вы можете удалить исходные файлы в текущем каталоге
Кроме того, если вы знаете, что файлы имеют разумное имя (без пробелов, подстановочных знаков, непечатаемых символов), вы можете сделать что-то вроде этого
источник
-p
сохранения метаданных. Использованиеls
должно быть последним средством, и здесь есть лучшие, более простые способы.На самом деле в Linux не существует «скрытых» файлов. Файлы, начинающиеся с точки, по умолчанию просто скрыты от списков файлов.
Чтобы скопировать файлы даже с глобусом, вам нужно добавить к файлу префикс,
.
например,mv -u .* foo
и он.foo
появится, какfoo/.foo
при перемещении.Параметр -u будет перемещать файлы только в том случае, если источник более новый или отсутствует пункт назначения. Или вы можете просто игнорировать ошибки о перемещении
.
и..
как они специальные файлы и не могут быть перемещены, но сделать пойманы в.*
Glob оболочки.источник
Итак, мы имеем:
а также:
Я потратил огромное время на поиск лучшего решения, чем все ответы здесь.
Затем я взял 30 секунд для этой команды:
Тогда я нашел свою любовь:
Примечание: я даже не понимаю аргумент
-T
. Он просто сделал то, что мне было нужно. Здесь говорится:источник
-T
. В любом случае это, по сути, говорит mv переместить сам каталог, а не перемещать все файлы из него.В моем случае я просто пытался
mv
найти один скрытый файл, и это было решением:объяснение
Сначала я пытался:
Но это продолжало выдавать ошибку:
Хотя и
ls -al
показал, что файл иdest/
существует.Причина в том, что оболочка интерпретировала "." в имени файла, поэтому, перемещая его в переменную, он избегает интерпретации. Возможно, есть и другие способы решения этой проблемы, но этого было достаточно для нас.
источник
Если вы хотите скопировать файлы, включая скрытые, в текущий каталог, в котором вы находитесь.
источник