Поиск папки, поиск и копирование файлов в новую папку с соответствующим окончанием файла [дубликат]

На этот вопрос уже есть ответ здесь:

Мне удалось захватить некоторые данные с пары hdd с помощью photorec, но я не могу понять, как файлы сохраняются, и это не очень удобно искать в тех recup_dir.*. Поэтому я решил разделить файлы по окончаниям. То есть все *.gif попадают в /home/mike/photorec/12gb/sorted/gif или что-то вроде этого. Но я не знаю, как выполнить поиск в корневом каталоге, определить расширение файла и переместить/cp в эту папку (а если ее нет, создать папку).

Таким образом я могу просто удалить ненужные папки/файлы, например dll.

Допустим, у меня есть три папки:

~/photorec/80gb
~/photorec/120gb
~/photorec/100gb

Photorec создает большое количество папок с именами recup_dir.1, recup_dir.2 и т.д., например:

.
├── recup_dir.1
├── recup_dir.10
├── recup_dir.11
├── recup_dir.12
└── recup_dir.9
    ├── f21750248.jpg
    ├── f21750275.gif
    ├── f21750277.gif
    ├── f21750281.gif
    ├── f21750296.jpg

Я хочу cd 80gb, запустить команду или выполнить bash скрипт внутри ~/photorec/80gb/, чтобы была создана новая папка, sorted, и внутри sorted я получил все файлы из recup_dirs, отсортированные по расширениям найденных файлов.

.
├── recup_dir.1
├── recup_dir.10
├── recup_dir.11
├── recup_dir.12
├── sorted
    ├── gif
        ├── f21750275.gif
        ├── f21750277.gif
        ├── f21750281.gif
    ├── jpg
        ├── f21750248.jpg
        ├── f21750296.jpg

Как мне этого добиться?

Edit: Это не только photorec. Это может быть любая папка, конечно.

5
задан 16 December 2018 в 03:12

2 ответа

Во-первых, создайте некоторые тестовые файлы:

mkdir -p 80gb/recup_dir.{1,10,11,12,9}
touch 80gb/recup_dir.9/f00{1..3}.{jpg,png,gif}

Это дает:

.
└── 80gb
    ├── recup_dir.1
    ├── recup_dir.10
    ├── recup_dir.11
    ├── recup_dir.12
    └── recup_dir.9
        ├── f001.gif
        ├── f001.jpg
        ├── f001.png
        ├── f002.gif
        ├── f002.jpg
        ├── f002.png
        ├── f003.gif
        ├── f003.jpg
        └── f003.png

Теперь:

find 80gb -type f -exec bash -c 'mkdir -p sorted/"${0##*.}"; mv "$0" sorted/"${0##*.}"' {} \;

$0 содержит текущее имя файла ( {} параметр к scriptlet) и "${0##*.}" расширение файла.

Результат:

.
├── 80gb
│  ├── recup_dir.1
│  ├── recup_dir.10
│  ├── recup_dir.11
│  ├── recup_dir.12
│  └── recup_dir.9
└── sorted
    ├── gif
    │  ├── f001.gif
    │  ├── f002.gif
    │  └── f003.gif
    ├── jpg
    │  ├── f001.jpg
    │  ├── f002.jpg
    │  └── f003.jpg
    └── png
        ├── f001.png
        ├── f002.png
        └── f003.png

Если Вы хотите sorted каталог ниже 80gb могло бы быть самым легким сделать a cd 80gb сначала и затем сделайте find . … вместо find 80gb ….

Вместо mv можно сначала хотеть сделать cp вместо этого в случае, если что-либо идет не так, как надо.

Протест

Выражение "${0##*.}" только работы для файлов с расширением. Для файлов без расширения это возвращает полное имя файла (включая путь), и команда перестанет работать. Если Вы ожидаете, что файлы без расширений изменяют команду к:

find 80gb -type f -name "*.*" -exec … \;

таким образом, это ловит только файлы с точкой в них.

4
ответ дан 23 November 2019 в 09:04

Вот путь, который перемещает все файлы одного расширения сразу при помощи bash globstar опция и цикличное выполнение по различным расширениям:

shopt -s globstar
for i in $(find -type f -name "*.*" -printf '%p\n' | sed 's/.*\.//' | sort -u); do \
  mkdir -p sorted/"$i"; \
  mv **/*."$i" sorted/"$i"; \
done

find | sed | sort список команд создает список существующих расширений файла по который for циклы цикла. Для каждого расширения, mkdir создает каталог под sorted/ и moves файлы соответствия к нему. **/ globstar шаблон и соответствия (теоретически) бесконечные каталоги и подкаталоги, посмотрите man bash/ SHELL ВСТРОЕННЫЕ КОМАНДЫ под shopt/globstar.

Пример выполняется

$ mkdir -p 80gb/recup_dir.{1,10,11,12,9}
$ touch 80gb/recup_dir.9/f00{1..3}.{jpg,png,gif}
$ tree
.
└── 80gb
    ├── recup_dir.1
    ├── recup_dir.10
    ├── recup_dir.11
    ├── recup_dir.12
    └── recup_dir.9
        ├── f001.gif
        ├── f001.jpg
        ├── f001.png
        ├── f002.gif
        ├── f002.jpg
        ├── f002.png
        ├── f003.gif
        ├── f003.jpg
        └── f003.png
$ shopt -s globstar; for i in $(find -type f -name "*.*" -printf '%p\n' | sed 's/.*\.//' | sort -u); do mkdir -p sorted/"$i"; mv **/*."$i" sorted/"$i"; done
$ tree
.
├── 80gb
│  ├── recup_dir.1
│  ├── recup_dir.10
│  ├── recup_dir.11
│  ├── recup_dir.12
│  └── recup_dir.9
└── sorted
    ├── gif
    │  ├── f001.gif
    │  ├── f002.gif
    │  └── f003.gif
    ├── jpg
    │  ├── f001.jpg
    │  ├── f002.jpg
    │  └── f003.jpg
    └── png
        ├── f001.png
        ├── f002.png
        └── f003.png
3
ответ дан 23 November 2019 в 09:04

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

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