Наверное, это популярный вопрос, но я не мог найти ответа.
Как переместить все файлы через *, включая скрытые файлы, в родительский каталог, например:
mv /path/subfolder/* /path/
Это переместит все файлы в родительский каталог, как и ожидалось, но не переместит скрытые файлы. Как это сделать?
cp -r /path/to/source/. /destination
Ответы:
Вы можете найти исчерпывающий набор решений по этому поводу в ответе UNIX и Linux на вопрос Как переместить все файлы (включая скрытые) из одного каталога в другой? . Он показывает решения на Bash, zsh, ksh93, стандартном (POSIX) sh и т. Д.
Вы можете использовать эти две команды вместе:
Или все вместе ( спасибо pfnuesel ):
Что расширяется до:
(пример:
echo a{.,}b
расширяется доa.b ab
)Обратите внимание, что это покажет пару предупреждений:
Просто игнорируйте их: это происходит потому, что
/path/subfolder/{.,}*
также расширяется до/path/subfolder/.
и/path/subfolder/..
, которые являются каталогом и родительским каталогом (см. Что означают «.» И «..» в папке? ).Если вы хотите просто скопировать, вы можете использовать просто:
Это скопирует все файлы, как обычные, так и скрытые, поскольку
/path/subfolder/.
расширяется до «всего из этого каталога» (Источник: Как скопировать с помощью cp, чтобы включить скрытые файлы и скрытые каталоги и их содержимое? )источник
mv /path/subfolder/* /path/subfolder/.* /path/
, не обязательно для объединения двух команд в одну.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
обозначает текущий каталог и..
обозначаетup
каталог. Вы, наверное, заметили, что все остальные файлы перемещены.Я считаю, что это самый элегантный вариант, так как он также не пытается двигаться
..
:источник
..anything
или...anything
т.д. - stackoverflow.com/a/31438355/2351568 содержит правильное регулярное выражение для этой проблемы. || но в любом случае использованиеshopt -s dotglob
- лучшее решение!{a,b}*
найдет все файлы, начинающиеся с a или b, такие как "анатомия" и "бульдозер". Второе совпадение - это просто пустое совпадение, эквивалентное*
, а первое совпадение эквивалентно.[!.]
, где группа[!.]
означает группу, НЕ начинающуюся с.
. Это значит,.*
но нет..*
.Вы могли включить
dotglob
:Чтобы выключить
dotglob
, вам нужно будет сказать:источник
man shopt
он не работает иhelp shopt
очень краток. Но вы можете сделатьbashman () { man bash | less -p "^ $1 "; }
и потомbashman shopt
прочитать все об этом прямо. (Возможно, придется нажать n, чтобы перейти к команде, если есть строки, начинающиеся с shopt, как я обнаружил.)ls
... таким образом, это не совсем то, что вам нужно, вероятноАльтернативное более простое решение - использовать
rsync
утилиту:Примечание. Вышеупомянутая команда покажет, что будет изменено. Чтобы выполнить фактические изменения, удалите
--dry-run
.Преимущество заключается в том, что исходная папка (
subfolder
) будет удалена вместе с частью команды, и при использованииmv
здесь примеров вам все равно нужно очистить свои папки, не говоря уже о дополнительной головной боли, чтобы скрыть скрытые и не скрытые файлы в одном единственном шаблон.Кроме того,
rsync
обеспечивает поддержку копирования / перемещения файлов между пультами дистанционного управления и гарантирует, что файлы копируются точно так, как они были изначально (-a
).Параметр used
-u
будет пропускать существующие более новые файлы,-r
рекурсивно перемещаться по каталогам и-v
повышать уровень детализации.источник
sudo
и--dry-run
, чтобы люди могли протестировать изменения перед запуском фактической команды, чтобы избежать возможного беспорядка.Разрешите представить вам моего друга «дотглоб». Он включается и выключается вне зависимости от того, есть ли в "*" скрытые файлы.
По умолчанию он выключен.
Лучше всего снова включить его, когда вы закончите, иначе вы запутаете вещи, которые предполагают, что он будет выключен.
источник
Используя
find
команду вместе сmv
командой, вы можете предотвратитьmv
попытку команды переместить каталоги (например,..
и.
) и подкаталоги. Вот один вариант:Есть проблемы с некоторыми другими предоставленными ответами. Например, каждый из следующих будет пытаться переместить подкаталоги из исходного пути:
Кроме того, 2) включает расширение. и .. файлы и 3) пропускает такие файлы, как ..foobar, ... barfoo и т. д.
Вы можете использовать,,
mv /source/path/{.[!.],..?,}* /destination/path
который будет включать файлы, пропущенные в пункте 3), но он все равно будет пытаться переместить подкаталоги. Использованиеfind
команды сmv
командой, описанной выше, устраняет все эти проблемы.источник
Мое решение этой проблемы, когда мне нужно скопировать все файлы (включая
.
файлы) в целевой каталог, сохраняя разрешения : (перезаписать, если уже существует)yes
предназначен для автоматической перезаписи файлов назначения,r
рекурсивного,v
подробного,p
сохранения разрешений.Обратите внимание, что исходный путь не заканчивается на
/
(поэтому все файлы / каталог и. Файлы копируются)Целевой каталог заканчивается тем,
/
что мы помещаем содержимое исходной папки в место назначения в целом.источник
yes
это отличная команда, которую можно использовать, если вы хотите переопределить файлы назначения, это не всегда желательно. Используйте его только в том случае, если вы уверены, что хотите это сделать. Кроме того, есть ли разница междуyes | cp ...
иcp -f ...
?