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


127

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

Відповіді:


189

З папкою під назвою "myfolder" і на один рівень в ієрархії файлів (точка, яку ви хочете поставити) команда буде:

mv myfolder/* .

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


35
Можливо, вам доведеться збігатися .*не лише, *якщо в архіві містяться крапки-файли. Також додайте до кінця `&& rmdir myfolder`, щоб видалити сторонні папки. Це збереження, оскільки воно запуститься лише у тому випадку, коли mv поверне успіх AND, оскільки rmdir не видалить не порожній каталог.
Калеб

Гарний момент на .*. Видалення оригінальної папки є тривіальним і не вимагається, тому ми дозволимо ОП впоратися з цим.
Руду

1
@Caleb чи можна писати *і .*в одному рядку? просто цікавість
Річард

2
@Richard Так, так. Всі аргументи для mvбуде джерелами, за винятком аргументу LAST, який повинен бути цільовим для переміщення (а у випадку кількох джерел - папкою).
Калеб

1
Я отримую удар:/bin/mv: Argument list too long
dragosrsupercool

26

Просто для того, щоб зробити його кришталево зрозумілим, взятим з відповіді Руду вище та коментарів.

Якщо вам потрібно перемістити весь вміст, Включаючи файли, які починаються з a. (наприклад, .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 вам потрібні [!.].


Які Rsync перемикачі -v, -u, -aі -rробити? AFAICT, -vє багатослівним, що просто робить rsync друкувати більше інформації. -uозначає оновлення - скопіюйте файл лише в тому випадку, якщо він новіший. Це не здається актуальним. -aозначає архів. Це скопіює власника та дозволи файлу та зробить синхронізацію рекурсивною. -rозначає рекурсивний, але це вже охоплено -a.
rjmunro

-uкорисно, коли ви не хочете витрачати зайвий час на переміщення даних, які вже є (особливо для повільних пристроїв зберігання даних). Я видалив -r, оскільки він охоплений, -aяк ви згадали.
kenorb

1
mv foo/* foo/.[^.]* .буде пропущено файл, викликаний, foo/..bar..наприклад. Зауважте, що для оболонок POSIX вам потрібні [!.].
Стефан Шазелас

Слід зазначити, що rsync -vua --delete-after foo/ .видаляється все інше, що вже існує в поточному каталозі.
Девід

7

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

mv (directory)/* .

якщо ви хочете видалити каталог, тоді додайте

rm -rf (directory)

Передбачається, що ви перебуваєте у батьківському каталозі (каталогу)

Якщо ви всередині (каталогу), то

mv * ../

13
Додаткова порада щодо безпеки. Під час видалення каталогу ви знаєте, що він повинен бути порожнім, rmdirскаржиться та виходить, якщо каталог не порожній, а rm -rнатомість він би просто видалив його та весь його вміст. (Це пока-ярмо .)
Анко

Чудова точка! Я не можу придумати причину, щоб не зробити так.
Марк Лалор

@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
Перегляньте свою редакцію : чим це відрізняється від вже схваленої відповіді ? І що спільного з цим має "спільний сервер"? Будь ласка, редагуйте, щоб пояснити ці пункти, якщо це стане корисним внеском, який додасть значення тому, що вже є тут.
Калеб

1
Я не згоден з тим, що спільний сервер не має до цього нічого спільного. Те, як вводиться "реж", змінює світ.
Рікардо Хавок

1
чувак, чому ти такий божевільний? ... Нічого ... я просто ділився трохи знаннями. Всі ми по-різному розуміємо і протиставляємо різні технічні проблеми по-різному ... Приємного вам дня Калеб ..
Рікардо Хавок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.