Цикл For не находит все файлы в каталоге

#bash #loops

#bash #циклы

Вопрос:

У меня есть несколько папок, в которых я запустил скрипт для переименования некоторых файлов. Однако до тех пор, пока не было около 300 файлов на папку, у него не возникало никаких проблем, теперь похоже, что цикл for просто не видит все файлы.

У меня есть файл с именем Folder_List.txt в нем есть ссылки на все папки, которые я хочу, чтобы он просматривал, и еще один, который архивирует уже переименованные файлы, чтобы они не удваивались.

Каждый видеофайл имеет 2 связанных файла, поэтому он все равно переименовал все 3 файла, а затем переходит к следующему, но теперь, когда он попадает в файл с именем S01E099, он перестает переименовывать, и я не могу понять, почему.

 #!/bin/bash
#Setup the folder parser
folder="/mnt/user/Storage/Google Drive/Server Files/Downloader/Folder_List.txt"
while IFS=$'r' read path; do

#Check to ensure the location exists
if [[ -d "$path" ]]
then
cd "$path"

#Declare Variable
c=0
filename_old=0
archive="/mnt/user/Storage/Google Drive/Server Files/Downloader/Episodes_archive.txt"

#Loop
for i in *; do 

    #Gets the extension
    ext=$(echo $i | awk -F '.' '{print $NF}')

    #Gets Season
    season=$(echo "$i" | awk -F 'E' '{print $1}')

    #Gets title
    title=$(echo $i | awk -F ' - ' '{print $2}')
    title=$(echo $title | awk -F '.' '{print $1}')

    #Checks for episode matches
    if [ ! "$title" == "$filename_old" ]
    then
        filename_old=$title
        ((c  ))
    fi

    #Gets the Episode number (needs to be after the episode match check)
    epnum=$(printf d $c)

    #Creates final filename
    filename_final=$season"E"$epnum" - "$title.$ext

    #Creates the naming structure for archiving
    filename_archive=$path$season"E"$epnum.$ext

    #Check if file was already renamed
    if grep -Fq "$filename_archive" < "$archive"
    then 
        #If file was already renamed do:
        continue
    else
        #Add renamed file to archive
        echo "$filename_archive"$'r' >> "$archive"
        echo "$filename_final renamed"
        #Rename File
        mv "$i" "$filename_final"
    fi

done
fi

done < "$folder"
  

Если это поможет что-то прояснить, файлы, которые должны быть переименованы, отформатированы как: S01E789 — название эпизода.mkv

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

Комментарии:

1. Попробуйте запустить скрипт, set -xv чтобы увидеть, что происходит.

2. Спасибо! похоже, у меня, должно быть, уже было до 115 в архиве, поэтому он пропускал файлы. Я удалил это имя файла из архива, и оно снова работает. В нем отсутствует несколько файлов, но теперь, когда я знаю о set -xv, я, вероятно, смогу устранить неполадки. Очень признателен.

3. Кстати, ext=$(echo $i | awk -F '.' '{print $NF}') на порядки медленнее, чем ext=${i##*.} и, кроме того, глючит . См . BashFAQ # 100 и / или вики-страницу bash-hackers о расширении параметров для наилучших практических подходов к работе со строками

4. Спасибо @CharlesDuffy, я самоучка, поэтому я уверен, что есть много способов, которыми я не все делаю правильно. Я прочитаю документы, которые вы связали, и я изменил их в своем коде. Очень признателен!

Ответ №1:

Должно быть, я ранее удалил несколько файлов или что-то в этом роде, потому что в архиве уже было до файла 115, поэтому он пропускал все найденные файлы, потому что думал, что они уже переименованы.

Большое спасибо @choroba за помощь.