2015-10-22 4 views
0

Я, вероятно, нахожусь здесь над моей головой. Я пытаюсь создать скрипт bash, который будет идентифицировать файлы, начинающиеся с 5 цифр, проверить, существует ли каталог для этого файла (или группы файлов) и переместить файлы в каталог. Если каталог не существует, я хочу его создать, а затем переместить файлы.Сравнение массивов и создание каталогов

Это сценарий, который я получил до сих пор, но реалистично это совсем не так.

#!/bin/bash 

files=($(find . -type f | grep -E "[0-9]{5}" -o)) 
directories=($(find . -type d)) 

for i in ${files[*]} 
do 
    printf "▸ ▸ pdf file found: %s\n" $i 
done 

for d in ${directories[*]} 
do 
printf "▸ ▸ directory found: %s\n" $d 
done 

NewDir=(`echo ${files[@]} ${directories[@]} | tr ' ' '\n' | sort | uniq -u `) 

for nd in ${NewDir[*]} 
do 
    printf "mkdir for: %s\n" $nd 
done 

Пример каталога, который должен быть отсортирован будет выглядеть следующим образом:

476B Oct 19 14:43 . 
544B Oct 21 10:36 .. 
68B Sep 17 08:14 12345/ 
68B Sep 17 08:14 12735/ 
    0B Sep 17 08:14 29375.pdf 
    0B Sep 17 08:14 29375a.pdf 
    0B Sep 17 08:14 29375-1.pdf 
    0B Sep 17 08:14 32952.pdf 
    0B Sep 17 08:14 39472.pdf 
68B Sep 17 08:14 59723/ 
    0B Sep 17 08:14 97132.pdf 
273B Oct 19 14:43 sort.sh  

Так поднятием этого примера, я хочу, чтобы идентифицировать файлы, начиная с 29375 и сделать каталог для них , затем переместите их в этот каталог.

Здесь я столкнулся с трудностями, сравнивая найденные файлы с существующими каталогами. Массив NewDir был тестом, который я делал, когда пытался найти решение для этого.

Спасибо за помощь в обращении/помощи.

ответ

1

Если я правильно понимаю ваш вопрос, это делает работу, без необходимости использования массивов:

for dir in $(find -E . -type f -regex ".*/[[:digit:]]{5}.*" \ 
       | sed -E '[email protected]\./([0-9]{5}).*@\[email protected]' | sort -u) ; do 
    if [ ! -d "$dir" ] ; then 
     mkdir "$dir" 
    fi 
    if [ ! -d "$dir" ] ; then 
     continue 
    fi 
    find -E . -type f -regex ".*/$dir.*" -exec mv \{\} $dir \; 
done 

В зависимости от количества каталогов, возможно, потребуется преобразовать это с помощью while цикла потребляющего выход find -E . -type f -regex ".*/[[:digit:]]{5}.*" | sed -E '[email protected]\./([0-9]{5}).*@\[email protected]' | sort -u, так как в его текущей форме последний может превышать допустимую длину.

EDIT: Обратите внимание, что -regex фактически гну расширение находки поэтому он будет работать только тогда, когда GNU находка является первым find найден на пути

+0

Спасибо. Попытка выяснить, что делает sed, но кроме того, скрипт делает что-то довольно странное. Тестирование команды find на ее основе дает правильные результаты. Однако, когда операторы if проверяют значение $ dir, он использует полное имя файла (с расширениями) вместо результатов команды find на своем собственном. После добавления некоторых отпечатков для отладки это происходит: Найдено файлов: ./11111-1.jpg Проверка наличия каталога ... Не найдено ни одного каталога. Создание: .11111-1.jpg mkdir: ./11111-1.jpg: Файл существует Существует ли каталог сейчас? .... Да. so..if [! -d $ dir] ищет каталог? – Martin

+0

Команда 'sed' в конвейере там точно, чтобы этого избежать. Вы уверены, что ничего не пропустили? То, что он делает, есть (для каждой строки ввода): захватить 5 цифр после '. /' И вывести этот захват. –

Смежные вопросы