Скрипт оболонки для переміщення всіх файлів із папок у батьківську папку


47

У мене папка в папці A. Я хочу перемістити файли з усіх цих папок у A.

Або

Я хочу вирізати всі файли з дочірніх папок і вставити їх у батьківську папку.

Як це зробити?


1
Я насправді не перевіряв це як надійність чи щось подібне, але ви намагалися просто ввести цю команду з папки А в термінал mv */* .:?
— Марті Фрід

Ви впевнені, що немає дублікатів назв файлів?
— джиппі

mv */* .не переміщуватиме файли з підпапок підпапок.
— Рахул Вірпара

@jippie так, немає жодних повторюваних імен
— Rahul Virpara

Відповіді:


81

Перейдіть у свій Aкаталог і запустіть

find . -mindepth 2 -type f -print -exec mv {} . \;

що означає "знайти всі файли в цьому каталозі та його підкаталогах та виконати mv з цільовою директорією.


1
він також намагається перемістити файли, які вже є у батьківському каталозі.
— Рахул Вірпара

virpara: тепер це ваше видання забуває всі файли в каталогах .dot. Переглянув його замість -mindepth 2, щоб придушити попередження.
— Туміноїд

1
З GNU findви можете бути трохи елегантнішими і не породити mvпроцес для кожного файлу:find A -mindepth 2 -type f -exec mv -t A \{\} +
— Девід Фоерстер,

Девіде, ваша версія працює до тих пір, поки ви не досягнете максимальної межі довжини командного рядка, що не так важко зробити з огляду на те, як знайти відбитки шляхів, особливо у випадку, коли ви викликаєте її з каталогу, який не є A, як у вашому прикладі.
— Туміноїд

9
Це дуже небезпечно. якщо у вас є файли з однаковим іменем файлу в різних підпапках, ви перезаписуєте їх усіма останніми знахідками. Краще використовувати mv з --backup = пронумеровано:find . -mindepth 2 -type f -print -exec mv --backup=numbered {} . \;
— pLumo

4

Добре, ви можете створити файл і назвати його "cutme" (щоб створити файл, який називається cutme в термінальному типі nano cutme. Щоб зберегти його, натисніть CTRL + X, потім натисніть ENTER.), Наприклад, вставте в нього припущення, якщо:

  1. Ви хочете зробити це рекурсивно (у підпапках і підпапках цих папок)
  2. Ви хочете пропустити переміщення файлу сценарію
  3. У вас є дозволи на переміщення файлів у цій папці
  4. Файли можуть містити пробіли у своїх іменах або не містити їх

find * -type f -print -not -type d -and -not -regex 'cutme' -exec mv {} .. \;

Зверніть увагу на ім'я cutme всередині рядка. Це має бути таким же, як і сценарій, який ви будете запускати.

Створивши файл і вставивши вищевказаний рядок, запустіть наступне в тій же папці, що і сценарій:

chmod +x cutme. Це дасть новий файл прапор «виконуваний файл» , так що ви можете виконати це в такий спосіб : ./cutme.


Чому я повинен намагатися перемістити файли, які вже є у батьківському каталозі?
— Рахул Вірпара

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