группирование и разделение файлов, содержащих числа в нем, на отдельные папки - PullRequest
2 голосов
/ 24 сентября 2019

Я хотел переместить файлы в группе из 30 в последовательности, начиная с image_1, image_2 ... из текущей папки в новую папку.

шаблон имени файла, как показано ниже

image_1.png
image_2.png
.
.
.
image_XXX.png

I want to move image_[1-30].png to folder fold30
and image[31-60].png to fold60 and so on 

У меня есть следующий код, чтобы сделать это, и он работает, хотел бы знать, есть ли ярлык для этого.

или есть какой-то меньший код, который я могу написать для того же

#!/bin/bash
counter=0
folvalue=30
totalFiles=$(ls -1 image_*.png | sort -V | wc -l)
foldernames=fold$folvalue
for file in $(ls -1 image_*.png | sort -V )
do
((counter++))
mkdir -p $foldernames
mv $file ./$foldernames/    
if [[ "$counter" -eq "$folvalue" ]];
then
  let folvalue=folvalue+30
  foldernames="fold${folvalue}"
  echo $foldernames
fi
done

вышеуказанный код перемещает image_1, image_2, .. 4..30 в папку

fold30

image_31, .... image_60 в папку

fold60

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Самый простой способ сделать это с rename, он же Perl rename.Он будет:

  • позволит вам запустить любой код произвольной сложности для определения нового имени,
  • позволит вам выполнить пробный прогон, сообщая вам, что он будет делать, ничего не делая,
  • предупреждает вас, если какие-либо файлы будут перезаписаны,
  • автоматически создает промежуточные иерархии каталогов.

Итак, вам нужна команда:

rename -n -p -e '(my $num = $_) =~ s/\D//g; $_ = ($num+29)-(($num-1)%30) . "/" . $_' *png

Пример вывода

'image_1.png' would be renamed to '30/image_1.png'
'image_10.png' would be renamed to '30/image_10.png'
'image_100.png' would be renamed to '120/image_100.png'
'image_101.png' would be renamed to '120/image_101.png'
'image_102.png' would be renamed to '120/image_102.png'
'image_103.png' would be renamed to '120/image_103.png'
'image_104.png' would be renamed to '120/image_104.png'
...
...

Если это выглядит правильно, вы можете запустить его снова без переключателя -n, чтобы сделать это по-настоящему.

0 голосов
/ 25 сентября 2019

Я действительно рекомендую использовать sed все время.Это трудно для глаз, но как только вы привыкнете к этому, вы сможете быстро выполнить все эти задачи, связанные с издевательствами.

То, что он делает, просто.Выполнение sed -e "s/regex/substitution/" <(cat file) проходит через каждую строку, заменяя соответствующие шаблоны regex на substitution.
. С его помощью вы можете просто преобразовать свой ввод в команды и направить его в bash.
Если вы хотите узнать больше, то это хорошо документация здесь .(но это не так просто для глаз)

В любом случае вот код:

while FILE_GROUP=$(find . -maxdepth 0 -name "image_*.png" | sort -V | head -30) && [ -n "$FILE_GROUP" ]
do
   $FOLDER="${YOUR_PREFIX}$(sed -e "s/^.*image_//" -e "s/\.png//" <(echo "$FILE_GROUP" | tail -1))"
   mkdir -p $FOLDER
   sed -e "s/\.\///" -e "s|.*|mv & $FOLDER|" <(echo "$FILE_GROUP") | bash
done

И вот что он должен делать:
- while цикл захватывает первый 30файлы.
- взять номер из последнего из этих файлов и назвать каталог
- mkdir FOLDER
- пройти через каждую строку и повернуть $FILE в mv $FILE $FOLDER, затем выполнить эти строки (трубаbash)

примечание: замените $YOUR_PREFIX своей папкой

РЕДАКТИРОВАТЬ: на удивление код не сработал из коробки (ктоподумал бы ...) Но я сделал некоторые исправления и тестирования, и это должно работать сейчас.

...