Скрипт для распространения каждого файла в соответствующий каталог

Сценарий:

У меня есть каталог с тысячами картинок в формате YYYYMMDDXXX

YYYY: stands for year
MM: stands for month
DD: stands for day
XXX: stands for an ID of the picture, it ranges from 1 to n characters

Необходимые:

Переместить каждое изображение в папку того дня. Я, например, читаю имя картинки, предположим, что ее имя 201504121A, затем эта картинка будет перемещена в каталог с именем 12-04-2015, затем переименуем его из 201504121A в просто ID, что означает 1A. Если этот каталог не найден, создайте его.

1
задан 3 June 2015 в 16:08

2 ответа

В ударе:

#! /bin/bash

for i
do
    f="${i##*/}"
    y="${f:0:4}"
    m="${f:4:2}"
    d="${f:6:2}"
    x="${f:8}"
    mkdir -p "$d-$m-$y" && mv "$i" "$d-$m-$y/$x"
done

Сохраните его как сценарий (скажите, mover.sh) и сделайте:

/path/to/mover.sh *

Или:

find /path/to/pics -type f -exec /path/to/mover.sh {} +

Используйте a echo вместо mkdir и mv к тест-драйву это.

  • f="${i##*/}" - получите компоненты каталога разделения имени файла.
  • y="${f:0:4}", и другие четыре - получают подстроки в том положении той длины.

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

#! /bin/bash

for i
do
    f="${i##*/}"
    if [[ $f =~ ([0-9]{4})([0-9]{2})([0-9]{2})(.*) ]]
    then
        y="${BASH_REMATCH[1]}"
        m="${BASH_REMATCH[2]}"
        d="${BASH_REMATCH[3]}"
        x="${BASH_REMATCH[4]}"
        mkdir -p "$d-$m-$y" && mv "$i" "$d-$m-$y/$x"
    fi
done
6
ответ дан 3 June 2015 в 16:08

Можно быть старым Linux / пользователь UNIX. Но я запишу инструкции, полагая, что Вы - новый пользователь Linux как я так, чтобы я не пропускал что-то из своей части...

Предупреждение!!!

Прежде, чем выполнить этот сценарий удостоверяются, что Вы сделали резервное копирование всех изображений, на которых Вы хотите выполнить этот сценарий, чтобы сделать операцию.. Существует много переменных как подсчет слов соглашения о присвоении имен и т.д., который может влиять на результат выполнения. Удостоверьтесь, что Вы копируете свои данные.. Ничто не будет удалено, но сценарий может изменить Ваши имена файлов нерегулярно, если существует какая-либо проблема.

Дон, t выполняют этот сценарий, если какое-либо изображение содержит идентификатор больше чем 2 символов. Поскольку Вы упомянули прежде "XXX: обозначает идентификатор изображения, это колеблется от 1 до n символов"

" и дало пример, "предполагают, что его имя составляет 201504121 А, тогда это изображение будет перемещено в каталог, названный 04.12.2015, тогда переименовывают его от 201504121 А до просто идентификатора, что означает 1 А"

, идентификатор изображений должен быть чем-то как 1 А 1B 1C 12 C 22 и т.д.... Вы понимаете мою мысль... Это должны быть 2 символа и не один символ как 1 2 3... или 3 символа как 222 666 777 и т.д...., это должно быть точно 2.. Если существуют некоторые изображения как этот..., я рекомендую изменить мой код, чтобы удовлетворить цели и всегда не забывать создавать резервную копию данных перед выполнением сценария.

Записанный в Bash

#!/bin/bash
#Developed by Sayan Bhattacharjee Date:26th may 2015 Tuesday Time 4:46PM IST
# conatact :zehel2892@gmail.com or askubuntu.com  Username:Sayan Bhatttacharjee
#More updates may come if required....
#Feel free to modify and redistribute this script
echo "Enter the extension of the files"
echo "like .jpg .png .bmp etc"
echo "make sure to enter . before the extension"
read extension
ls *$extension  > filenames
echo "Showing all the files of the extension present in the following directory"
cat filenames
echo "Checking line read option"
## while it reads line by line it will perform the required actions
while read line
do
echo "==============================================================="
    imageName=$line # updates the name of the image one by one in each loop according to how they are saved in the file
    echo "Imagefile is - $name"
    echo "Running file name resolver"
    echo "Running year resolver"

    year=${imageName:0:4 } #takes 4 lettters from the front
    echo "Year is $year"
    echo "Running month resolver"
    abc=${imageName: (-10) } # it will extract 10 characters from  the end   of 201504121A.jpg to produce 04121A.jpg

    month=${abc:0:2 } #It takes two characters from front of 04121A.jpg to produce 04

    echo "month is $month"
    echo "Running day resolver" 
    abc1=${imageName: (-8) } # it will extract 8 characters from  the end   of 201504121A.jpg to produce 121A.jpg
    day=${abc1:0:2 } #It takes two characters from front of 121A.jpg to produce 12
    echo "day is $day"

    echo "Running ID resolver"
    abc2=${imageName: (-6) }  # it will extract 6 characters from  the end   of 201504121A.jpg to produce 1A.jpg
    ID=${abc2:0:2 } #It takes two characters from front of 1A.jpg to produce 1A
    echo "$ID"
echo "Present Working Directory is"
pwd > base.txt #saving present working directory
baseDirectory=`cat base.txt`
echo "$baseDirectory"
echo ".............................................................."
echo "Running Directory creation and Image Insertion"
echo "Directory will not be created if it exists"
mkdir $day-$month-$year
echo "moving image and renaming it........"
mv $baseDirectory/$year$month$day$ID$extension $baseDirectory/$day-$month-$year/$ID$extension
cd $day-$month-$year
#echo "Present Working Sub Directory is"
#pwd > subpwd.txt #saving present working directory
#presentWorkingSubDirectory=`cat subpwd.txt`
#echo "$presentWorkingSubDirectory"
echo "Returning to Base Directory"
cd $baseDirectory
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
done < filenames
echo "execution finished"

Сохраняют блок кода в текстовом файле как dataOrganiser.sh (или любое другое имя, которое Вы предпочитаете; но расширение должно быть .sh). Удостоверяются, что dataOrganiser.sh находится в каталоге, где все Ваши изображения.. иначе это не будет работать, и необходимо вручную настроить его ... Также знать, что это будет в состоянии работать над файлами изображений только одного расширения за один раз...., например, это будет работать над .jpg сначала тогда .png и другими...., выбор расширения будет дан Вам на времени выполнения.. Также возможно использовать его на других форматах файлов как .txt .doc, .pdf и т.д.

Тогда дают исполняемые полномочия dataOrganiser.sh файлу путем ввода

 sudo chmod 755 /path/to/dataOrganiser.sh

755, даст Вам запись чтения и выполнит полномочия и считает и запишет полномочия другим. Вас попросят Вашего пароля.. введите его для выполнения как sudo. Теперь выполните сценарий путем ввода

/path/to/file/dataOrganiser.sh

После того, как сценарий запустится.. Вас попросят дать расширение изображений..., можно дать только один вид расширения за один раз. И расширения, которые могут быть даны, должны быть сделаны из трех алфавитов как jpg bmp png gif и т.д. , Что-либо как tiff не будет работать.. необходимо изменить сценарий..... снова удостоверяются, что Вы копируете изображения

, Когда спросили ввести дополнительное имя, вводят его как .jpg или .bmp или .png или .gif, потому что необходимо дать. (точка перед расширением работы)..

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

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

0
ответ дан 3 June 2015 в 16:08

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

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