Як перемістити всі файли в поточній папці до підпапки?


69

Я на шляху:

/myuser/downloads/

І я створюю підпапку:

/myuser/downloads/new

Тепер я хочу перемістити всі файли та папки / підпапки в папці завантажень до підпапки.

як я можу це зробити?

Я намагався:

mv -R *.* new/

Але переміщення не приймає перемикач -R, здається.


4
Вам не потрібно -R. Тільки mv * newнезважаючи на те, воно буде скуголити "не може перейти нове до нового" чи щось подібне. Можливо, mv -i * newвам заважають переписувати.

Відповіді:


100

Команда

mv !(new) new

повинен зробити трюк. Якщо це не працює, запустіть shopt -s extglobспочатку.

Щоб також переміщувати приховані файли / каталоги (які починаються з крапки), також запустіть shopt -s dotglobспочатку.
Отже, підводячи підсумки:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(завжди краще знімати, dotglobщоб уникнути поганих сюрпризів).


5
Ви можете згадати, у чому полягає значення !(something)?
Adeerlike

2
@adeer, що просто говорить не (щось). Іншими словами, скопіюйте все, але не щось. Ясна, як грязь?
RockyMountainHigh

4
дуже. ви випадково знаєте еквівалент zsh?
Adeerlike

1
Я не розумію, наприклад, що якщо я спробую перемістити вміст папки devдо мого поточного місця, чи потрібно це виконати mv !(dev) dev?? Я отримую-bash: !: event not found
Чорний

5
@adeer дуже схожий. setopt extendedglobдля встановлення розширеного глобального режиму в zsh. ^є символом виключення, і mv ^new newце зробить трюк. потім, щоб побачити всі параметри, встановлені в zsh, які ви можете використовувати, setoptі вимкнути розширений глобальний режим, який ви можете зробитиunsetopt extendedglob
Містер T

10

Я знайшов щось подібне, але трохи простіше зрозуміти, і це може спрацювати і для вас:

ls | grep -v new | xargs mv -t new

Додавання пояснення до вищезазначеного рішення:

З чоловічих сторінок:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Пояснено за кроком:

  • ls перерахує файли в поточному каталозі
  • grep -v new повернеться трубопровід до того, що не відповідає новому
  • xargs mv -t newперемістить файли, передані в нього, grep -vдо цільового каталогу

Я спробував цей метод , але я отримую: mv: illegal option -- t. Це тому, що я використовую zsh?
ConstantFun

@ConstantFun Це може бути zsh, але я б припустив, що це ваша реалізація mv, (тобто ваша версія mv відрізняється від того, що я використовував) що OS ви використовуєте? Я вважаю , що , коли я писав цю відповідь , я був на дистрибутиві з centosдопомогою bash.
lockwobr

2
Тільки тестуючи це на osx, і я отримую ту ж помилку, mv: illegal option -- tяка пов’язана з тим, що у mx osx немає -tможливості.
lockwobr

1
(Я не пробував цього і не планую цього.) Це посилання apple.stackexchange.com/questions/69223/… розповідає, як встановити gnucore, який повинен допомогти вам отримати утиліти gnu core cli, osx судна з bsd Інструменти для cli, які відрізняються тим, які постачаються з Linux.
lockwobr

Я на OSX працює zsh, так що це, мабуть, ОС тоді ..? Дякуємо за уточнення!
ConstantFun

7

Проста ідея. Якщо припустити, що ви перебуваєте в / myuser , перейменуйте завантаження на нове , створіть нову каталог завантажень, а потім перемістіть нову в неї.

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Якщо ви хочете перемістити всі файли з папки до однієї з її папок, ви можете скористатися наступною командою:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Він знайде всі файли, а потім перемістить їх у свою папку.

@waltinator: додано -type d -name 'new' -pruneдля запобігання обходу /myuser/downloads/new.


Я створив підкаталог на ім’я newі спробував цю команду, я отримую mv: missing file operandіTry 'mv --help' for more information
mook765

1

Ви можете спробувати цей альтернативний процес –– залишатися на шляху

/myuser/downloads/

але, замість того , щоб перші створення /myuser/downloads/new/каталогу, замість того, щоб створити папку в /myuser/директорії, з командою mkdir ../new, а потім перемістити всі файли downloadsдо new, і , нарешті , перейти newв downloads. Це можна зробити в одному рядку, перебуваючи в /myuser/downloads/контурі, за допомогою команди:

mkdir ../new && mv * ../new && mv ../new ../downloads

У цьому випадку вам не доведеться турбуватися про якесь «фільтрування» файлів / папок, оскільки newце знаходиться на тому ж рівні шляху downloads, що і ви можете просто перемістити все downloadsдо new, а потім перейти newдо завантажень ».

Однак якщо у вас вже newстворена підпапка, і ви не хочете створювати ще одну, не хвилюйтесь - просто змініть mkdirкоманду з лівої сторони першої &&в наведеній вище mvкоманді на команду, натискаючи newна шлях; Іншими словами, поки ви все ще знаходитесь /myuser/downloads/, ви можете перейти mkdir ../newна mv new ... Тоді підпапка new[на шляху /myuser/downloads/new/] висувається вгору /myuser/new/, на тому ж рівні /myuser/downloads/, що і тоді ви можете виконати решту команди, як показано вище. Все разом ми маємо, починаючи зі шляху /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

і, оскільки ви хотіли "перемістити всі файли та папки / підпапки в папці завантажень до підпапки [ new]", ви закінчили! Якщо ви хотіли переміщувати лише файли (або лише папки або [вставити більш деталізований рух об’єкта]), тоді вам доведеться використовувати інші команди, які можуть "фільтрувати" об'єкти, наприклад grep. Команди, написані вище, є достатніми для ваших цілей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.