Переместите содержание папки один уровень

Самый стандартный ответ pax, который рекомендуется cpio и tar.

В отличие от этого, cpio и POSIX tar, но как GNU tar, pax может к обоим архивным файлам, и сожмите архив. Это поведение отличается от zip, который сжимает каждый файл прежде, чем поместить его в архив.

132
24.08.2011, 23:49
7 ответов

С папкой, названной 'myfolder' и одним уровнем в файловой иерархии (точка Вы хотите, чтобы это поместило), команда была бы:

mv myfolder/* .

Так, например, если данные были в /home/myuser/myfolder затем от /home/myuser/ выполните команду.

201
27.01.2020, 19:29
  • 1
    Вы, возможно, должны также соответствовать .* не просто * если архив содержал точечные файлы. Также добавьте '&& rmdir myfolder' в конец o что удалить теперь постороннюю папку. Это - сохранение, потому что оно будет только работать, если mv возвратит успех И потому что rmdir не удалит непустой каталог. –  Caleb 24.08.2011, 23:53
  • 2
    на .*. Удаление исходной папки и тривиально и не попросившее относительно того, таким образом, мы позволим OP иметь дело с этим самостоятельно. –  Rudu 24.08.2011, 23:57
  • 3
    @Caleb - это возможный записать обоим * и .* в одной строке? просто любопытство –  Richard 13.11.2012, 22:40
  • 4
    @Richard Да, это. Аргументы в пользу mv все будут источники кроме ПОСЛЕДНЕГО аргумента, который должен быть целью для перемещения (и в случае многочисленных источников, должна быть папка). –  Caleb 13.11.2012, 22:50
  • 5
    я получаю удар: /bin/mv: Argument list too long –  dragosrsupercool 17.11.2014, 09:46

Для тех из вас, кто находится на сервере с общим доступом, необходимо использовать нечто подобное

Для перемещения файлов

mv -v ~/public_html/public_html/* ~/public_html/

Для копирования файлов

cp -a ~/public_html/* ~/public_html/* ~/public_html/

0
27.01.2020, 19:29

просто выдайте команду mv

mv (directory)/* .

, если вы хотите удалить каталог, то добавьте

rm -rf (directory)

Предполагается, что вы находитесь в родительском каталоге (каталога)

Если вы находитесь внутри (каталога), то

mv * ../
7
27.01.2020, 19:29

Это можно сделать следующими методами:

  • используя rsync:

    rsync -vua --delete-after foo/ .
    
  • используя cp и rmdir:

    cp -vaR foo/. . && rmdir foo/
    
  • используя mv (с включенной опцией dotglob):

    shopt -s dotglob # Включает имена файлов, начинающиеся с точки.
    mv -- foo/* . # Где foo/ - папка, состоящая из файлов.
    shopt -u dotglob # Отключает ранее включенную опцию dotglob.
    

    где foo/ - папка, содержимое которой должно быть перемещено на один уровень вверх.

    Смотрите: help shopt и man bash .

  • Используя mv (как предлагалось здесь ):

    mv foo/* foo/.[^.]* . && rmdir foo/ .
    

    Примечание: Он пропустит файл под названием foo/...bar... .

    Примечание: Для оболочек POSIX нужно [!] .

16
27.01.2020, 19:29

Чтобы прояснить ситуацию, взято из ответа Руду выше и комментариев.

Если вам нужно переместить все содержимое, ВКЛЮЧАЯ файлы, начинающиеся с. (например, .htaccess, .git и т. д.), вам необходимо включить в свою команду как *, так и. *. Примерно так:

 mv subfolder/* subfolder/.* .

Это переместит содержимое подпапки в вашу текущую папку. Обратите внимание на пробел перед последним «.».

26
27.01.2020, 19:29

Я думаю, что лучший ответ:

mv myfolder/mysubfolder.

Иногда возникает проблема, связанная с тем, что обе папки имеют одинаковое имя

mv myfolder myfolder.old 
mv myfolder.old/myfolder. 
rmdir myfolder.old
1
05.08.2020, 13:00

В вопросе не указано, какой шелл, поэтому вот вариант zsh :

mv myfolder/*(D).

(D)обеспечивает включение как точечных, так и не -точечных файлов, но, что особенно важно, не включает объекты .и ... Это эквивалентно решению dotglob от kenorb.

0
13.04.2021, 15:27

Теги

Похожие вопросы