Сценарий для “извлечения” подпапок в родительскую папку

Это собирающееся быть немного хитрым, я предполагаю :-)

Когда я открываю терминал в папке и запускаю скрипт, тот сценарий должен:

  1. переместите все содержание всех подпапок к главной родительской папке (рекурсивно)
  2. удалите все пустые папки

Родительская папка мы помогаем, не будет содержать папок, просто содержание всех их.

Это должно работать на скрытые файлы и папки также. Это было бы очень полезно для уборки в доме :-)

Я попробовал что-то как:

find . -type f -name "*" -depth | xargs mv ./

Но без удачи.

Спасибо за Вашу справку :-)

5
задан 11 August 2015 в 06:14

3 ответа

Самый простой и самый чистый путь, по-моему, состоял бы в том, чтобы использовать эту команду:

find . -type f -exec mv --backup=numbered {} . \; && find . -maxdepth 1 -type d -exec rm -r {} +

find команда № 1:

  • .: поиски в текущем рабочем каталоге;
  • -type f: поиски файлов;
  • -exec [...]: выполняет любого команда для каждого результата (использующий {} [...] \;) или команда для всех результатов (использующий {} +);
  • mv --backup=numbered . \;: перемещения каждый результат в текущем рабочем каталоге, создав резервное копирование файлов с тем же именем файла уже в текущем рабочем каталоге;

find команда № 2:

  • .: поиски в текущем рабочем каталоге;
  • -maxdepth 1: поиски только на первом уровне целевой иерархии каталогов;
  • -type d: поиски каталогов;
  • -exec [...]: выполняет любого команда для каждого результата (использующий {} [...] \;) или команда для всех результатов (использующий {} +);
  • rm -r {} +: удаляет каждый результат;

Тест на тестовой иерархии каталогов:

user@debian ~/tmp % tree -a
.
├── 1
│   ├── file1
│   ├── file2
│   ├── file3
│   └── .hidden
├── 2
│   ├── file1
│   ├── file2
│   ├── file3
│   └── .hidden
└── 3
    ├── file1
    ├── file2
    ├── file3
    └── .hidden

3 directories, 12 files
user@debian ~/tmp % find . -type f -exec mv --backup=numbered {} . \; && find . -type d -exec rm -r {} +
rm: refusing to remove "." or ".." directory: skipping "."
user@debian ~/tmp % tree -a
.
├── file1
├── file1.~1~
├── file1.~2~
├── file2
├── file2.~1~
├── file2.~2~
├── file3
├── file3.~1~
├── file3.~2~
├── .hidden
├── .hidden.~1~
└── .hidden.~2~

0 directories, 12 files
9
ответ дан 23 November 2019 в 08:41
  1. Для перемещения всех файлов рекурсивно в текущий каталог обратите внимание, что это переместит все файлы в этот каталог (не их родительские каталоги):

    find . -type f -exec mv -i -t . {} +  
    

Вместо -i как показано уже можно использовать --backup=numbered @kos.

  1. Для удаления всех пустых каталогов:

    find . -type d -empty -delete
    

Read man find для получения большей идеи.

5
ответ дан 23 November 2019 в 08:41

Это должно добиться цели для Вас:

find . -type f -exec mv --backup=numbered "{}" . \; && find . -type d -empty -delete

Это 2, находят команды, первый находит и перемещает файлы, второй будет только работать, если первая команда будет успешна и удалит каталоги.

Благодаря Rinzwind для указания на опасность дублирующихся имен файлов, предлагая мне добавить --backup=numbered опция, первоначально используемая Косом.

2
ответ дан 23 November 2019 в 08:41

Другие вопросы по тегам:

Похожие вопросы: