Intereting Posts
ISP заблокирован порт 25 из-за спама Ошибка прокси-сервера VirtualBox USB login loop: systemd-udevd : не удалось выполнить '/ bin / systemctl start –no-block nvidia-persistenced.service': нет такого файла или каталога Как установить среду Ruby в Linux? Обновление VIM 7.3 до последней версии через apt-get Как настроить контекстное меню файлов в Xubuntu XFCE Thunar file manager? Установите / запустите ubuntu на внешний жесткий диск с ноутбуком Windows? Могу ли я выбрать между GNOME Shell и Unity при входе в систему? Изменение определенных строк с помощью sed Как отобразить имя назначенного документа с помощью Okular 0.19.3 в Kubuntu 14.04 Trusty Tahr LTS? Предупреждение о низком диске. Может ли вредоносное ПО вызвать эту проблему? Мобильный широкополосный доступ не подключается без выключения и подключения Файл не удаляется из корзины даже после sudo rm -rf ~ / .local / share / Trash / Asus Strix GTX970 Не удалось получить разрешение 1920×1080 Ubuntu 14.04 Проблемы с установкой и удалением MySQL в Ubuntu

Как я могу получить mv (или подстановочный знак) для перемещения скрытых файлов?

Я переношу свой домашний каталог из старой системы в новую, и tarball, который я сделал, содержит все, включая скрытые файлы, такие как .bashrc. Однако, когда я перемещаю содержимое распакованного tarball (который находится в / tmp) в мой новый домашний каталог, скрытые файлы не копируют ( mv /tmp/home/rcook/* /home/rcook/ ). Как я могу заставить mv перемещать их?

На самом деле, я думаю, что проблема не в mv, а в том, что с помощью bash's globbing. Если я это сделаю:

 mkdir a mkdir b touch a/.foo touch a/bar mv a/* b/ ls -aa/ b/ 

Я вижу это:

 a/: . .. .foo b/: . .. bar 

a/.foo не двигался. Итак, как я могу получить подстановочный знак * для поиска скрытых файлов?

Да, я полагаю, я мог распаковать tarball прямо в мой домашний каталог, но tarball распаковывается в home/rcook/... , и я хочу быть уверенным, что перезаписываю новый .bashrc и т. Д. home/rcook/... старыми, настроенными версиями, и знание того, как находить и перемещать скрытые файлы, является полезным навыком. Предложения?


Некоторые ответы предлагают сделать что-то вроде mv src/.* dest/ . Тем не менее, я попробовал это в своих тестовых каталогах и получил ошибки. Начиная с:

 rcook$ ls -aa/ 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 -aa/ b/ a/: . .. bar b/: . .. .foo 

Что я делаю не так?

Вы можете сделать это :

 shopt -s dotglob mv /tmp/home/rcook/* /home/rcook/ 

Вы можете положить

 shopt -s dotglob 

в вашем ~/.bashrc если вы хотите, чтобы он был по умолчанию.

См. http://mywiki.wooledge.org/glob


Другой подход к копированию файлов точек:

 mv /tmp/home/rcook/.[!.]* /home/rcook/ 

Не используйте шаблон ..* поскольку он соответствует .. (указатель на родительский каталог). Если есть файлы, имя которых начинается с двух точек ( ..something ), также используйте шаблон ..?* .

В ваших дополнениях вы получили ошибки, но код все еще работал. Единственное, что нужно добавить, это то, что вы сказали ему только скопировать точечные файлы. Пытаться:

 mv src/* src/.* dst/ 

Вы все равно получите ошибки для. и .. записи, что хорошо. Но движение должно быть успешным.

 ~/scratch [andrew] $ mv from/* from/.* to/ mv: cannot move 'from/.' to 'to/.': Device or resource busy mv: cannot remove 'from/..': Is a directory ~/scratch [andrew] $ ls -a from/ to/ from/: . .. to/: . .. test .test 

Если вы ls -l в каталоге, вы увидите . и .. среди перечисленных файлов. Итак, я думаю, что mv .* /dest учитывает эти указатели. Пытаться:

 mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/ 

это игнорирует те текущие и родительские указатели.

Вы получите сообщение об ошибке, если любой из трех шаблонов * , [^.]* Или ..?* соответствует файлу, поэтому вы должны включать только те, которые соответствуют.

На Linux нет такой вещи, как «скрытые» файлы. Файлы, начинающиеся с точки, по умолчанию скрыты от файлов.

Чтобы скопировать файлы даже с помощью glob, вам нужно префикс файла . таких как mv -u .* foo а затем .foo будет отображаться как foo/.foo при перемещении.

Параметр -u будет перемещать файлы только в том случае, если источник является более новым или отсутствует место назначения. Или вы можете просто игнорировать ошибки в перемещении . и .. поскольку они являются специальными файлами и не могут быть перемещены, но попадаются в .* glob оболочкой.

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

 cp -Rp . /desired/directory 

то вы можете удалить исходные файлы в текущем каталоге

В качестве альтернативы, если вы знаете, что файлы названы по назначению (без пробелов, подстановочных знаков, непечатаемых символов), вы можете сделать что-то вроде этого

 mv $(ls -A) /desired/directory 

Таким образом, мы имеем:

 a |-- .foo `-- bar 

а также:

 b 

Я потратил огромное время на лучшее решение, чем все ответы здесь.

Затем я взял 30 секунд для этой команды:

 $ mv --help 

Затем я нашел свою любовь:

 $ mv a/ b/ -T 

Примечание. Я даже не понимаю аргумент -T . Он просто сделал то, что мне нужно. Здесь говорится:

-T, –no-target-directory рассматривать DEST как обычный файл

Если вы хотите скопировать файлы, включая скрытые файлы, в текущий каталог, в котором вы находитесь.

 cp -Rp source-directory/. .