Как перенести все файлы, включая скрытые файлы в директории через *
Это должен быть популярный вопрос, но я не мог найти ответа.
Как переместить все файлы через * в том числе скрытые файлы, а также в родительский каталог, как это:
mv /path/subfolder/* /path/
это переместит все файлы в родительский каталог, как ожидалось, но не будет перемещать скрытые файлы. Как это сделать?
7 ответов:
вы можете найти полный набор решений по этому вопросу в ответе UNIX & Linux на как вы перемещаете все файлы (в том числе скрытые) из одного каталога в другой?. Он показывает решения в Bash, zsh, ksh93, standard (POSIX) sh и т. д.
вы можете использовать эти две команды вместе:
mv /path/subfolder/* /path/ # your current approach mv /path/subfolder/.* /path/ # this one for hidden filesили все вместе (спасибо pfnuesel):
mv /path/subfolder/{.,}* /path/, который расширяется:
mv /path/subfolder/* /path/subfolder/.* /path/(пример:
echo a{.,}bувеличивается доa.b ab)обратите внимание, что это покажет несколько предупреждений:
mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy mv: cannot remove /path/subfolder/..’: Is a directoryпросто игнорируйте их: это происходит потому, что
/path/subfolder/{.,}*также расширяется до/path/subfolder/.и/path/subfolder/.., которые являются каталогом и родительским каталогом (см. что делать "." и." .- в смысле, когда в папке?).
если вы хотите просто скопировать, вы можете использовать простой:
cp -r /path/subfolder/. /path/ # ^ # note the dot!это скопирует все файлы, как обычные, так и скрытые, так как
/path/subfolder/.расширяется до "все из этого каталога" (источник: как скопировать с помощью cp, чтобы включить скрытые файлы и скрытые каталоги и их содержимое?)
Это переместит все файлы в родительский каталог, как ожидалось, но будет не перемещать скрытые файлы. Как это сделать?
вы можете включить
dotglob:shopt -s dotglob # This would cause mv below to match hidden files mv /path/subfolder/* /path/для того, чтобы выключить
dotglob, вам нужно будет сказать:shopt -u dotglob
Я думаю, что это самый элегантный, а также не пытается двигаться
..:mv /source/path/{.[!.],}* /destination/path
альтернативное более простое решение-использовать
rsyncутилиты:rsync -vuar --delete-after path/subfolder/ path/преимущество в том, что исходную папку (
subfolder) будет удален, а также часть команды, и при использованииmvпримеры здесь вам все еще нужно очистить ваши папки, не говоря уже о дополнительной головной боли, чтобы покрыть скрытые и не скрытые файлы в одном шаблоне.кроме того
rsyncобеспечивает поддержку копирования/перемещения файлов между пультов, и это будет убедиться, что файлы копируются точно так же, как они были первоначально (-a).используемого
-uпараметр пропустит существующие новые файлы,-rрекурсия в каталоги и-vувеличится многословие.
Позволь мне познакомить тебя с моим другом "dotglob". Он включается и выключается независимо от того, включает ли "*" скрытые файлы.
$ mkdir test $ cd test $ touch a b c .hidden .hi .den $ ls -a . .. .den .hi .hidden a b c $ shopt -u dotglob $ ls * a b c $ for i in * ; do echo I found: $i ; done I found: a I found: b I found: c $ shopt -s dotglob $ ls * .den .hi .hidden a b c $ for i in * ; do echo I found: $i ; done I found: .den I found: .hi I found: .hidden I found: a I found: b I found: cпо умолчанию "выкл".
$ shopt dotglob dotglob offлучше всего включить его обратно, когда вы закончите в противном случае вы будете путать вещи, которые предполагают, что он будет выключен.
С помощью в сочетании с
mvкоманда, вы можете предотвратитьmvкоманда от попытки переместить каталоги (например..и.) и подкаталоги. Вот один из вариантов:find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;есть проблемы с некоторыми другими ответами. Например, каждое из следующих действий будет пытаться переместить подкаталоги из исходного пути:
1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/ 2) mv /path/subfolder/{.,}* /path/ 3) mv /source/path/{.[!.],}* /destination/pathкроме того, 2) включает в себя . и.. файлы и 3) пропускает файлы, такие как ..фрагментик, ...барфу и др.
вы могли бы использовать,
mv /source/path/{.[!.],..?,}* /destination/path, который будет включать файлы, пропущенные 3), но он все равно попытается переместить подкаталоги. Используя сmvкоманда, как я описал выше, устраняет все эти проблемы.
мое решение этой проблемы, когда мне нужно скопируйте все файлы (включая
.файлы) в целевой каталог сохранение разрешения is: (перезаписать, если уже существует)yes | cp -rvp /source/directory /destination/directory/
yesпредназначен для автоматической перезаписи файлов назначения,rрекурсивный,vмногословный,pсохранить права.заметил, что исходный путь не заканчивается с
/(так что все файлы / каталог и. файлы копируются)каталог назначения заканчивается
/как мы помещаем содержимое исходной папки в пункт назначения в целом.
Comments