На этот вопрос уже есть ответ здесь:
Мне удалось захватить некоторые данные с пары 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. Это может быть любая папка, конечно.
Во-первых, создайте некоторые тестовые файлы:
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 … \;
таким образом, это ловит только файлы с точкой в них.
Вот путь, который перемещает все файлы одного расширения сразу при помощи 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/
и m
ov
es файлы соответствия к нему. **/
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