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

127

У меня есть каталог, который распакован, но находится в папке. Как я могу переместить содержимое на один уровень выше? Я получаю доступ к CentOS через SSH.

Калеб
источник

Ответы:

189

С папкой myfolder и уровнем иерархии файлов на один уровень выше (точка, которую вы хотите указать), команда будет выглядеть так:

mv myfolder/* .

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

Rudu
источник
35
Вам также может потребоваться сопоставить .*не только *если архив содержит точечные файлы. Также добавьте `&& rmdir myfolder` до конца, чтобы удалить ненужную папку. Это сохранение, потому что оно будет работать только в том случае, если mv вернет успех И потому, что rmdir не удалит непустой каталог
Калеб
Хорошая точка зрения на .*. Удаление оригинальной папки является тривиальным и не требуется, поэтому мы позволим OP разобраться с этим самостоятельно.
Руду
1
@Caleb можно ли написать как *и .*в одну строку? просто любопытство
Ричард
2
@ Ричард Да, это так. Все аргументы для mvбудут источниками, кроме аргумента LAST, который должен быть целью перемещения (а в случае нескольких источников должен быть папкой).
Калеб
1
Я получаю bash:/bin/mv: Argument list too long
dragosrsupercool
26

Просто чтобы сделать это кристально ясным, взятым из ответа Руду выше и комментариев.

Если вам нужно переместить все содержимое, включите файлы, которые начинаются с. (например, .htaccess, .git и т. д.), вам нужно включить и * и. * в вашу команду. Вот так:

 mv subfolder/* subfolder/.* .

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

Ричард
источник
это работает, но я получаю mv: rename fake/. to ./.: Invalid argumentиmv: rename fake/.. to ./..: Invalid argument
Маслоу
16

Это возможно с помощью следующих методов:

  • Использование rsync:

    rsync -vua --delete-after foo/ .
  • Использование cpи rmdir:

    cp -vaR foo/. . && rmdir foo/
  • Использование mvdotglobвключенной опцией):

    shopt -s dotglob # Includes filenames beginning with a dot.
    mv -- foo/* .    # Where foo/ is the folder consisting the files.
    shopt -u dotglob # Disables previously enabled dotglob option.

    где foo/находится ваша папка, содержимое которой нужно переместить на один уровень вверх?

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

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

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

    Примечание. Будет пропущен файл с именем foo/..bar...

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

kenorb
источник
Каковы Rsync переключатели -v, -u, -aи -rделать? AFAICT, -vмногословен, что просто заставляет rsync печатать больше информации. -uозначает обновление - копировать файл, только если он более новый. Это не кажется актуальным. -aзначит архив. Это скопирует владельца и разрешения файла и сделает синхронизацию рекурсивной. -rозначает рекурсивный, но это уже покрыто -a.
17
-uполезно, когда вы не хотите тратить дополнительное время на перемещение данных, которые уже есть (особенно для медленных устройств хранения). Я удалил -r, так как он покрыт, -aкак вы упомянули.
Кенорб
1
mv foo/* foo/.[^.]* .пропустит файл, который называется, foo/..bar..например. Обратите внимание, что для оболочек POSIX вам нужно [!.].
Стефан
Следует отметить, что rsync -vua --delete-after foo/ .удаляет все остальное, что может уже существовать в текущем каталоге.
Дэвид
7

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

mv (directory)/* .

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

rm -rf (directory)

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

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

mv * ../
Ранджит Сиджи
источник
13
Дополнительный совет по безопасности: при удалении каталога, который, как вы знаете, должен быть пустым, он rmdirжалуется и выходит, если каталог не пустой, а rm -rвместо этого просто удалил бы его и все его содержимое. (Это пока-иго .)
Anko
Отличный момент! Я не могу придумать причину, чтобы не делать это таким образом.
Марк Лалор
@MarkLalor Одной из причин может быть наличие скрытых файлов, таких как вездесущий .DS_storeв macOS. Команда mvвыше не будет перемещать их (без dotglobнабора).
AkselA
0

для тех из вас, на общем сервере, вы должны использовать что-то вроде этого

Переместить файлы

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

Чтобы скопировать файлы

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

Рикардо Хавок
источник
2
Приведенный выше вопрос касается перемещения, а не копирования содержимого. Это дублирует файлы, оставляя оригиналы в подпапке. Кроме того, быть «общим» сервером или нет, не имеет к этому никакого отношения.
Калеб
1
ваше право, и вот ответ для этого ...
Рикардо Хавок
2
Re your edit: как это отличается от уже проголосовавшего ответа ? И при чем тут «общий сервер»? Пожалуйста, отредактируйте, чтобы объяснить эти пункты, если это будет полезным вкладом, который добавляет ценность к тому, что уже здесь.
Калеб
1
Я не согласен с тем, что общий сервер не имеет к этому никакого отношения. То, как вводится «dir», меняет мир.
Рикардо Хавок
1
чувак, почему ты так злишься ... вау .. я просто делюсь небольшим знанием. Мы все понимаем по-разному и по-разному сталкиваемся с различными техническими проблемами ... Удачного вам дня, Калеб ..
Рикардо Хавок