Прочитать файлы в каталоге и сгруппировать их в новом подкаталоге (создать подкаталог и переименовать файл)

311
Zuul

Я выполнил восстановление для старых удаленных файлов! Процесс был полным успехом и восстановил файлы много лет назад.

Теперь проблема проходит через все 400000 файлов, восстановленных только по типу JPG.

Чтобы справиться с этим, я уже разделил файлы по размеру и сохранил те, которые соответствуют критериям, в другом каталоге:

find /path/to/files/ -size +100k -print0 | xargs -0 cp --target-directory=/path/to/filtered/files/ 

Поскольку файлы должны анализироваться удаленно, я подготовил веб-страницу для отображения всех файлов, что позволяет сохранять их локально. Эта веб-страница представит файлы 20 одновременно со стрелками навигации!


Мой вопрос заключается в том, как разделить 400000 файлов на подкаталоги, содержащие по 20 файлов в каждом, и последовательно переименовать файлы:

Переименовать в

000001.jpg 000002.jpg ... 000020.jpg 

Переместиться в подкаталог, создав подкаталог

page_0001 

Повторяйте, пока все 400000 не будут обработаны!

page_0002/000021.jpg page_0002/000022.jpg ... page_0002/000040.jpg 
4
... переименовывается последовательно на основании чего? Время их модификации? Их алфавитно-цифровой порядок сортировки? slhck 11 лет назад 0
@slhck, никакой конкретной спецификации для переименования, просто присваиваю «приличное» имя файлу, связанному с более поздними проблемами обработки, поэтому, по сути, переименовывается по мере чтения! Zuul 11 лет назад 0
Зачем вам нужно, чтобы они были в подкаталогах? Daniel Andersson 11 лет назад 0

2 ответа на вопрос

2
Octávio Filipe Gonçalves

У меня та же проблема. Я пишу этот код в BASH, и работал для меня.

Изменить с вашими потребностями:

#/bin/bash  target_prefix=page  SOURCE_DIR=YOUR_DIR #Change this to source dir  N=0 Z=0  for entry in $SOURCE_DIR/* do N=$((N+1)) Z=$((Z+1))  if [ "$N" == "1" ]; then mkdir $SOURCE_DIR/$target_prefix-$Z DIR="$SOURCE_DIR/$target_prefix-$Z" fi  echo "Move image $entry number $N to dir $DIR"  mv $entry $DIR/$Z.jpg #Change to your file extension  if [ "$N" == "20" ]; then N=0 fi done 

Надеюсь эта работа.

Я попробую и скоро вернусь к вам! Zuul 11 лет назад 0
Ткс, сделал работу довольно хорошо! Не решен вопрос с нулем кредитования, но я смогу разобраться с этим на более позднем этапе! Опять ткс. Zuul 11 лет назад 0
0
Alex Chamberlain

Следующий скрипт Bash должен сделать свое дело, но никаких гарантий.

i=1 for f in * do fn=$(printf "%.6d" $i).jpg dn=page_$(printf "%.4d" $(($i%20))) mkdir -p $dn cp $f "$dn/$fn" i=$(($i+1)) done 
Я попробую и дам вам обратную связь! Zuul 11 лет назад 0
`for f in *` может не работать с 400000 (!) файлами. Это слишком много аргументов для обработки. Рассмотрим цикл поиска -print0` приводит к передаче в `` read -d '' -r file` или подобному. slhck 11 лет назад 0
Исправлены скобки. Я не пытался запустить это, так как у меня не было подходящего набора файлов. Alex Chamberlain 11 лет назад 0
Я пробовал это, но он выдавал неопределенную ошибку ... Не могу точно сказать, что это была ошибка :( Zuul 11 лет назад 0

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