Вопрос Как я могу получить 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 -a a/ b/

Я вижу это:

a/:
.  ..  .foo

b/:
.  ..  bar

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

Да, я полагаю, я мог распаковать tarball прямо в мой домашний каталог, но tarball распаковывается в 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

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


100
2018-02-21 19:14


происхождения


unix.stackexchange.com/a/251091/139312 - palindrom


ответы:


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

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), также используйте шаблон ..?*,


114
2018-02-21 19:16



Пожалуйста, ознакомьтесь с дополнениями, которые я поставил в нижней части моего вопроса. Благодарю. - Randall Cook
Ничего не случилось, . а также .. являются специальными дисками: соответственно текущий каталог & родительский каталог, Это просто предупреждение. Лучшее использование shopt -s dotglob решение - Gilles Quenot
В итоге я сделал два хода: mv home/rcook/* /home/rcook/ с последующим mv home/rcook/.* /home/rcook/, Это сделало трюк, хотя я бы хотел, чтобы я следил за ссылкой и сначала прочитал о режиме dotglob. Это бы спасло меня. +1 - Randall Cook
Итак, второй подход требует использования абсолютных путей? - franzlorenzon
Если вы используете zsh, вы можете использовать D классификатор globbing или GLOB_DOTS вариант оболочки, - mgalgs


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

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

23
2018-01-03 18:47



Хорошие моменты, @AndrewSchwartz. Мне тоже нравится этот подход. Я думаю, что он заслуживает большего признания. - Randall Cook


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

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

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

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


10
2018-06-14 12:20



Ницца. Аналогичный ответ для этого стиля глобирования можно найти здесь: superuser.com/a/784046/144977 , Спасибо, что опубликовали это. - phyatt


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

cp -Rp . /desired/directory

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

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

mv $(ls -A) /desired/directory

5
2018-02-21 22:03



Copy-then-remove сильно отличается от перемещения, если источник и цель находятся в одной файловой системе. По крайней мере, включите опцию -p для сохранения метаданных. С помощью ls должно быть в последнюю очередь, и здесь есть лучшие, более простые способы. - Gilles


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

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

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


2
2018-02-21 19:17



Пожалуйста, ознакомьтесь с дополнениями, которые я поставил в нижней части моего вопроса. Благодарю. - Randall Cook


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

a
|-- .foo
`-- bar

а также:

b

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

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

$ mv --help

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

$ mv a/ b/ -T

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

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


0
2017-07-28 00:42



Если вы опускаете косые черты, вам не нужно -T, В любом случае это, по существу, говорит mv, чтобы переместить сам каталог, а не перемещать все файлы изнутри. - thomasrutter
@thomasrutter, не перемещает каталог сам по себе, как переименование? - Randall Cook
Да, если родительский пункт назначения остается прежним, он просто переименовывает его. Однако вы ссылаетесь на него, вероятно, это не помогает ответить на исходный вопрос, касающийся перемещения файлов внутри каталог в заданное место. - thomasrutter


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

cp -Rp source-directory/. .

-1
2017-09-05 00:51



Это очень похоже на ответ Дрейка Кларриса с 2013 года. У вас есть что добавить? - Randall Cook