2015-04-08 3 views
0

Я пишу сценарий bash, который должен сортировать фотографии по частям их имен в папки. Проблема в том, что у меня много ошибок, и я не могу найти ошибку. Даже ShellCheck ничего не нашел, поэтому, если бы вы, ребята, могли мне помочь, это было бы здорово.Bash Script не создает папки и пытается переместить их самостоятельно

Мой сценарий:

#!/bin/bash 

Total=$(ls -1 | wc -l) 
echo "$Total" 
Count=1 

while [[ $Count < $Total ]] 
do 
    NameOut=$(ls -1 | grep -o '[^-]*,[^-]*' | sed -n "$Count"p) 
    echo "$NameOut" 
    Filename=$(ls -1 | sed -n "$Count"p) 
    echo "$Filename" 
    if [ -d "$NameOut" ]; then 
     mv "$Filename" "$NameOut"/ 
     Count=$((Count + 1)) 
    else 
     mkdir "$NameOut" 
     mv "$Filename" "$NameOut"/ 
     Count=$((Count + 1)) 
    fi 
done 

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

ls -1 

REZ-Name,Surname-02-12-1996.jpg 
BLEACH-Name,Surname-04-08-2008.jpg 
+1

Я закатил ваши правки, потому что ** в основном ** изменил вопрос, который вы задавали, и это не то, как работает этот сайт. Если заданное решение решило проблему, которую вы задали, вы принимаете ее и задаете новый вопрос для новых проблем. –

ответ

1

shellcheck делает идентифицировать несколько проблем с этим сценарием.

Этот сценарий также очень неэффективен, поскольку он многократно перебирает содержимое файла, когда ему это не нужно.

Массив имен файлов будет намного лучший способ выполнить эту задачу.

Это, как говорится, ничто из этого не имеет отношения к ошибке, которую вы указали.

Проблема с вашим скриптом - это линии print.

Что вы ожидаете от них?

Строки echo уже распечатывают ваши значения переменных. Возможно, вы имели в виду printf '%s\n' "$var"? (Который бы просто дублировал вывод линий echo?)

print - это совсем другая команда и пытается выяснить, как напечатать аргумент, который вы ему дали (например, на принтере и т. Д.).


Невеста, но что-то вроде этого, вероятно, сделает то, что вы хотите. Оставшееся использование grep можно почти наверняка заменить, но, не видя репрезентативных входных и выходных данных, это вряд ли отклонилось от первоначального намерения.

#!/bin/bash 

files=(*) 
total=${#files[@]} 
echo "$total" 

count=1 
while ((count < total)); do 
    filename=${files[count - 1]} 
    echo "$filename" 
    nameout=$(echo "$filename" | grep -o '[^ ]*,[^ ]*') 
    mkdir -p "$nameout" 
    mv "$filename" "$nameout/" 
    count=$((count + 1)) 
done 
+0

Там только для отладки, поэтому я знаю, что хранится в переменных – Nroh

+0

Линии 'echo' делают это для вас. Строки 'print' неверны. Возможно, вы имели в виду 'printf'? –

+1

Кроме того, использование @Nroh '>> Names.txt' - хорошо известный анти-шаблон оболочки, который создает все больше и больше файлов каждый раз, когда он запускает скрипт для его проверки. Обратите внимание: 'print' работает как' printf' и 'echo' в' ksh', но НЕ работает для целей отладки в 'bash' (он пытается отправить файл на принтер). Всем удачи. – shellter

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