Как перенести все файлы, включая скрытые файлы в директории через *



Это должен быть популярный вопрос, но я не мог найти ответа.



Как переместить все файлы через * в том числе скрытые файлы, а также в родительский каталог, как это:



mv /path/subfolder/* /path/


это переместит все файлы в родительский каталог, как ожидалось, но не будет перемещать скрытые файлы. Как это сделать?

971   7  

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

    Ничего не найдено.