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


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.