#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 за помощь.