diff --git a/Moodle/PHP/createfile.php b/Moodle/PHP/createfile.php new file mode 100644 index 0000000..62c9994 --- /dev/null +++ b/Moodle/PHP/createfile.php @@ -0,0 +1,67 @@ +dirroot.'/course/lib.php'); +require_once($CFG->dirroot.'/mod/resource/lib.php'); + +global $DB, $CFG; + +// Ép user thành admin để tránh lỗi guest +$admin = get_admin(); +\core\session\manager::set_user($admin); + +// ==== Thông tin cần thay đổi ==== +$courseid = 1645; // ID khóa học +$sectionnum = 1; // số thứ tự section/topic +$filepath = '/nas1videos/English Learning/English with Lucy - Beautiful British English B2 Programme (Upper Intermediate) 2025-6/02. PDF/B2 Week 1 Weekly Langua Prompts.pdf'; + +$filename = basename($filepath); // Tên activity + +// Lấy course +$course = $DB->get_record('course', ['id'=>$courseid], '*', MUST_EXIST); + +// Lấy section thực theo số thứ tự +$section = $DB->get_record('course_sections', ['course'=>$courseid,'section'=>$sectionnum], '*', MUST_EXIST); +$sectionid = $section->id; + +// Module ID cho resource +$moduleid = $DB->get_field('modules','id',['name'=>'resource'], MUST_EXIST); + +// ===== Tạo bản ghi resource ===== +$resource = new stdClass(); +$resource->course = $courseid; +$resource->name = $filename; +$resource->intro = ''; +$resource->introformat = FORMAT_HTML; +$resource->display = 0; // hiển thị link trực tiếp +$resource->externalurl = $filepath; // link đến file repository +$resource->section = $sectionid; +$resource->timecreated = time(); +$resource->timemodified = time(); +$resource->visible = 1; + +// Thêm vào bảng resource +$resource->id = $DB->insert_record('resource', $resource); + +// ===== Tạo course module ===== +$cm = new stdClass(); +$cm->course = $courseid; +$cm->module = $moduleid; +$cm->instance = $resource->id; +$cm->section = $sectionid; +$cm->visible = 1; +$cm->added = time(); +$cm->score = 0; +$cm->indent = 0; +$cm->completion = 0; + +// Thêm vào bảng course_modules +$cm->id = $DB->insert_record('course_modules', $cm); + +// ===== Cập nhật course_sections ===== +course_add_cm_to_section($course, $cm->id, $sectionnum); + +echo "✅ File activity '{$filename}' đã được tạo trong course {$courseid}, section {$sectionnum}, cmid={$cm->id}\n"; diff --git a/Moodle/PHP/newtest.php b/Moodle/PHP/newtest.php new file mode 100644 index 0000000..7e7e38c --- /dev/null +++ b/Moodle/PHP/newtest.php @@ -0,0 +1,160 @@ +dirroot . '/course/lib.php'); +require_once($CFG->dirroot . '/mod/page/lib.php'); + +/** + * Hàm tạo một Page Activity trong Moodle. + * + * @param int $courseid ID của khóa học. + * @param int $topicid ID của topic (section) trong khóa học. + * @param string $page_name Tên của trang. + * @param string $page_content Nội dung của trang. + * @return int|false Trả về ID của page nếu thành công, hoặc `false` nếu thất bại. + * @throws Exception Nếu xảy ra lỗi. + */ +function create_page_activity($courseid, $topicid, $page_name, $page_content) { + global $DB; + + try { + // Lấy thông tin khóa học. + $course = $DB->get_record('course', ['id' => $courseid], '*', MUST_EXIST); + + // Kiểm tra section tồn tại. + $section = $DB->get_record('course_sections', ['course' => $courseid, 'section' => $topicid], '*', MUST_EXIST); + + // Dữ liệu của activity page. + $page_data = (object)[ + 'course' => $courseid, + 'name' => $page_name, // Tên của trang (tên tệp đã bóc tách). + 'content' => $page_content, // Nội dung trang. + 'contentformat' => FORMAT_HTML, // Định dạng nội dung. + 'intro' => 'Automatically generated page activity.', // Phần giới thiệu mặc định. + 'introformat' => FORMAT_HTML, // Định dạng phần giới thiệu. + 'timemodified' => time() // Thời gian chỉnh sửa cuối cùng. + ]; + + // Tạo bản ghi trong bảng `page`. + $pageid = $DB->insert_record('page', $page_data); // **Cập nhật DB: Bảng `page`.** + if (!$pageid) { + throw new moodle_exception('Không thể tạo bản ghi trong bảng page.'); + } + + // Tạo bản ghi trong bảng `course_modules` (CM). + $module = $DB->get_record('modules', ['name' => 'page'], '*', MUST_EXIST); // Lấy module ID cho `page`. + $module_instance = (object)[ + 'course' => $courseid, + 'module' => $module->id, + 'instance' => $pageid, // Liên kết với bản ghi trong `page`. + 'section' => $section->id, + 'added' => time(), + 'visible' => 1, // Hoạt động này có hiển thị không. + 'visibleold' => 1, + 'groupmode' => 0, + 'groupingid' => 0, + 'groupmembersonly' => 0 + ]; + $cmid = $DB->insert_record('course_modules', $module_instance); // **Cập nhật DB: Bảng `course_modules`.** + if (!$cmid) { + throw new moodle_exception('Không thể tạo bản ghi trong bảng course_modules.'); + } + + // Cập nhật bảng `course_sections`. + $section->sequence = trim($section->sequence . ',' . $cmid, ','); + $DB->update_record('course_sections', $section); // **Cập nhật DB: Bảng `course_sections`.** + + rebuild_course_cache($courseid); // Xây dựng lại bộ nhớ đệm của khóa học. + + // Ghi lại sự kiện trong `logstore_standard_log`. + $event = \core\event\course_module_created::create([ + 'context' => context_course::instance($courseid), + 'objectid' => $cmid, + 'courseid' => $courseid, + 'relateduserid' => null, // Không cần thiết nếu chạy từ CLI. + 'other' => [ + 'modulename' => 'page', + 'instanceid' => $pageid, // Thêm instanceid. + 'name' => $page_name // Thêm tên hoạt động. + ] + ]); + $event->trigger(); // **Ghi vào DB: Bảng `logstore_standard_log`.** + + return $pageid; + } catch (Exception $e) { + echo "Lỗi: " . $e->getMessage() . "\n"; + return false; + } +} + +/** + * Hàm phân tích một dòng stream và bóc tách tên tệp. + * + * @param string $stream_line Dòng stream cần phân tích. + * @return array Mảng chứa tên tệp đã bóc tách và dòng stream. + */ +function parse_stream_line($stream_line) { + // Kiểm tra nếu chuỗi có dấu ngoặc vuông hay không. + if (strpos($stream_line, '[') === false || strpos($stream_line, ']') === false) { + return ['', '']; // Trả về giá trị mặc định nếu không có dấu ngoặc vuông. + } + + // Giả sử tệp có dạng: [stream=tháng năm/tên_video.mp4] + preg_match('/\[(.*?)\]/', $stream_line, $matches); + + // Kiểm tra nếu tìm thấy tên tệp trong dòng stream. + if (isset($matches[1])) { + $file_name_with_extension = $matches[1]; // Lấy tên tệp từ dòng stream. + + // Loại bỏ phần mở rộng tệp (ví dụ .mp4, .avi, .jpg) + $file_name_without_extension = pathinfo($file_name_with_extension, PATHINFO_FILENAME); + + // Loại bỏ các ký tự không cần thiết ở cuối (các phần sau dấu gạch nối, gạch dưới hoặc ký tự vô nghĩa) + // Chỉ giữ lại các phần tên hợp lý trước khi xuất hiện các ký tự đặc biệt. + $file_name_clean = preg_replace('/[^\w\s-]/', '', $file_name_without_extension); // Loại bỏ các ký tự đặc biệt. + $file_name_clean = preg_replace('/[-\s]+/', ' ', $file_name_clean); // Thay thế các dấu gạch nối và khoảng trắng liên tiếp bằng một dấu cách. + $file_name_clean = trim($file_name_clean); // Loại bỏ khoảng trắng ở đầu và cuối. + + return [$file_name_clean, $stream_line]; // Trả về tên tệp đã được xử lý và dòng stream. + } + + // Nếu không tìm thấy tên tệp, trả về giá trị mặc định. + return ['', '']; +} + +// Chương trình chính +$courseid = 1347; // ID của khóa học. +$topicid = 0; // ID của topic (section) trong khóa học. + +// Kiểm tra xem có truyền tên tệp từ dòng lệnh không +if ($argc < 2) { + echo "Vui lòng cung cấp tên tệp chứa các dòng stream.\n"; + exit(1); +} + +// Đọc tên tệp từ dòng lệnh +$filename = $argv[1]; + +// Kiểm tra nếu tệp có tồn tại không +if (!file_exists($filename)) { + echo "Tệp không tồn tại: {$filename}\n"; + exit(1); +} + +// Đọc tệp và xử lý từng dòng +$file_lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); +foreach ($file_lines as $stream_line) { + // Lấy tên tệp và dòng stream. + list($page_name, $page_content) = parse_stream_line($stream_line); + + // Tạo Page Activity với nội dung từ dòng stream. + $pageid = create_page_activity($courseid, $topicid, $page_name, $page_content); + if ($pageid !== false) { + echo "Tạo Page Activity thành công! Page ID: {$pageid}\n"; + } else { + echo "Không thể tạo Page Activity.\n"; + } +} +?> + diff --git a/Moodle/PHP/objpage.php b/Moodle/PHP/objpage.php new file mode 100644 index 0000000..2287bf2 --- /dev/null +++ b/Moodle/PHP/objpage.php @@ -0,0 +1,136 @@ +dirroot . '/course/lib.php'); +require_once($CFG->dirroot . '/mod/page/lib.php'); + +class PageActivityGenerator { + + protected $courseId; + protected $topicId; + protected $streamFile; + + public function __construct($streamFile, $courseId, $topicId) { + $this->courseId = $courseId; + $this->topicId = $topicId; + $this->streamFile = $streamFile; + } + + public function run() { + if (!file_exists($this->streamFile)) { + echo "Lỗi: Không tìm thấy file: {$this->streamFile}\n"; + exit(1); + } + + $lines = file($this->streamFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + foreach ($lines as $line) { + list($filename, $url) = $this->parse_stream_line($line); + if (!$filename || !$url) { + echo "⚠️ Bỏ qua dòng không hợp lệ: $line\n"; + continue; + } + + $pageName = $this->ensure_utf8($filename); + $pageContent = $this->ensure_utf8('[stream=' . $url . ']'); + + $success = $this->create_page_activity($pageName, $pageContent); + if ($success) { + echo "✅ Đã tạo Page: $pageName\n"; + } + } + } + + protected function ensure_utf8($string) { + return mb_convert_encoding($string, 'UTF-8', mb_detect_encoding($string, 'UTF-8, ISO-8859-1, ISO-8859-15', true)); + } + + protected function parse_stream_line($line) { + if (preg_match('/\[stream=(.*?)\]/', $line, $matches)) { + $url = trim($matches[1]); + $filename = pathinfo($url, PATHINFO_FILENAME); + $filename_clean = preg_replace('/[^\p{L}\p{N}\s_-]/u', '', $filename); // Giữ unicode và ký tự hợp lệ + return [$filename_clean, $url]; + } + return ['', '']; + } + + protected function create_page_activity($pageName, $pageContent) { + global $DB; + + try { + // Lấy thông tin course & topic + $course = $DB->get_record('course', ['id' => $this->courseId], '*', MUST_EXIST); + $section = $DB->get_record('course_sections', ['course' => $this->courseId, 'section' => $this->topicId], '*', MUST_EXIST); + + // Tạo bản ghi trong bảng page + $page = (object)[ + 'course' => $this->courseId, + 'name' => $pageName, + 'content' => $pageContent, + 'contentformat' => FORMAT_HTML, + 'intro' => 'Automatically generated page activity.', + 'introformat' => FORMAT_HTML, + 'timemodified' => time() + ]; + + $pageId = $DB->insert_record('page', $page); + if (!$pageId) { + throw new moodle_exception("Không thể tạo bản ghi trong bảng page."); + } + + // Tạo bản ghi trong bảng course_modules + $module = $DB->get_record('modules', ['name' => 'page'], '*', MUST_EXIST); + + $cm = (object)[ + 'course' => $this->courseId, + 'module' => $module->id, + 'instance' => $pageId, + 'section' => $section->id, + 'added' => time(), + 'visible' => 1, + 'visibleold' => 1, + 'groupmode' => 0, + 'groupingid' => 0, + 'groupmembersonly' => 0 + ]; + + $cmid = $DB->insert_record('course_modules', $cm); + if (!$cmid) { + throw new moodle_exception("Không thể tạo bản ghi trong bảng course_modules."); + } + + // Cập nhật chuỗi hoạt động của section + if (!empty($section->sequence)) { + $section->sequence .= ',' . $cmid; + } else { + $section->sequence = $cmid; + } + $DB->update_record('course_sections', $section); + + // Làm mới cache khóa học + rebuild_course_cache($this->courseId); + + return $pageId; + + } catch (Exception $e) { + echo "❌ Lỗi: " . $e->getMessage() . "\n"; + return false; + } + } +} + +// CLI entry point +if ($argc !== 4) { + echo "Cách dùng: php script.php \n"; + exit(1); +} + +$streamFile = $argv[1]; +$courseId = (int)$argv[2]; +$topicId = (int)$argv[3]; + +$generator = new PageActivityGenerator($streamFile, $courseId, $topicId); +$generator->run(); diff --git a/Moodle/PHP/page.php b/Moodle/PHP/page.php new file mode 100644 index 0000000..c6af6c3 --- /dev/null +++ b/Moodle/PHP/page.php @@ -0,0 +1,123 @@ +dirroot . '/course/lib.php'); +require_once($CFG->dirroot . '/mod/page/lib.php'); + +/** + * Đảm bảo chuỗi ở định dạng UTF-8. + * + * @param string $string Chuỗi cần kiểm tra. + * @return string Chuỗi đã được đảm bảo là UTF-8. + */ +function ensure_utf8($string) { + return mb_convert_encoding($string, 'UTF-8', 'auto'); +} + +/** + * Hàm tạo một Page Activity trong Moodle. + */ +function create_page_activity($courseid, $topicid, $page_name, $page_content) { + global $DB; + + try { + $course = $DB->get_record('course', ['id' => $courseid], '*', MUST_EXIST); + $section = $DB->get_record('course_sections', ['course' => $courseid, 'section' => $topicid], '*', MUST_EXIST); + + // Đảm bảo tên và nội dung luôn là UTF-8 + $page_name = ensure_utf8($page_name); + $page_content = ensure_utf8($page_content); + + $page_data = (object)[ + 'course' => $courseid, + 'name' => $page_name, + 'content' => $page_content, + 'contentformat' => FORMAT_HTML, + 'intro' => 'Automatically generated page activity.', + 'introformat' => FORMAT_HTML, + 'timemodified' => time() + ]; + + $pageid = $DB->insert_record('page', $page_data); + if (!$pageid) { + throw new moodle_exception('Không thể tạo bản ghi trong bảng page.'); + } + + $module = $DB->get_record('modules', ['name' => 'page'], '*', MUST_EXIST); + $module_instance = (object)[ + 'course' => $courseid, + 'module' => $module->id, + 'instance' => $pageid, + 'section' => $section->id, + 'added' => time(), + 'visible' => 1, + 'visibleold' => 1, + 'groupmode' => 0, + 'groupingid' => 0, + 'groupmembersonly' => 0 + ]; + $cmid = $DB->insert_record('course_modules', $module_instance); + if (!$cmid) { + throw new moodle_exception('Không thể tạo bản ghi trong bảng course_modules.'); + } + + $section->sequence = trim($section->sequence . ',' . $cmid, ','); + $DB->update_record('course_sections', $section); + + rebuild_course_cache($courseid); + + return $pageid; + } catch (Exception $e) { + echo "Lỗi: " . $e->getMessage() . "\n"; + return false; + } +} + +/** + * Phân tích dòng stream và đảm bảo tên UTF-8. + */ +function parse_stream_line($stream_line) { + if (strpos($stream_line, '[') === false || strpos($stream_line, ']') === false) { + return ['', '']; + } + + preg_match('/\[(.*?)\]/', $stream_line, $matches); + if (isset($matches[1])) { + $file_name_with_extension = $matches[1]; + $file_name_without_extension = pathinfo($file_name_with_extension, PATHINFO_FILENAME); + $file_name_clean = preg_replace('/[^\w\s-]/u', '', $file_name_without_extension); // Sử dụng flag `u` cho UTF-8 + $file_name_clean = preg_replace('/[-\s]+/', ' ', $file_name_clean); + $file_name_clean = trim($file_name_clean); + return [ensure_utf8($file_name_clean), ensure_utf8($stream_line)]; + } + + return ['', '']; +} + +// Nhận tham số từ dòng lệnh +if ($argc < 4) { + echo "Usage: php script.php \n"; + exit(1); +} + +$filename = $argv[1]; +$courseid = intval($argv[2]); +$topicid = intval($argv[3]); + +if (!file_exists($filename)) { + echo "Tệp không tồn tại: {$filename}\n"; + exit(1); +} + +$file_lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); +foreach ($file_lines as $stream_line) { + list($page_name, $page_content) = parse_stream_line($stream_line); + $pageid = create_page_activity($courseid, $topicid, $page_name, $page_content); + if ($pageid !== false) { + echo "Tạo Page Activity thành công! Page ID: {$pageid}\n"; + } else { + echo "Không thể tạo Page Activity.\n"; + } +} +?> diff --git a/Moodle/PHP/agets.sh b/Moodle/SH/agets.sh similarity index 100% rename from Moodle/PHP/agets.sh rename to Moodle/SH/agets.sh diff --git a/Moodle/PHP/batch_run.sh b/Moodle/SH/batch_run.sh similarity index 100% rename from Moodle/PHP/batch_run.sh rename to Moodle/SH/batch_run.sh diff --git a/Moodle/PHP/create_course.sh b/Moodle/SH/create_course.sh similarity index 100% rename from Moodle/PHP/create_course.sh rename to Moodle/SH/create_course.sh diff --git a/Moodle/PHP/createcourse.sh b/Moodle/SH/createcourse.sh similarity index 100% rename from Moodle/PHP/createcourse.sh rename to Moodle/SH/createcourse.sh diff --git a/Moodle/PHP/ebatch_run.sh b/Moodle/SH/ebatch_run.sh similarity index 100% rename from Moodle/PHP/ebatch_run.sh rename to Moodle/SH/ebatch_run.sh diff --git a/Moodle/PHP/ecreate_course.sh b/Moodle/SH/ecreate_course.sh similarity index 100% rename from Moodle/PHP/ecreate_course.sh rename to Moodle/SH/ecreate_course.sh diff --git a/Moodle/PHP/elearning.sh b/Moodle/SH/elearning.sh similarity index 100% rename from Moodle/PHP/elearning.sh rename to Moodle/SH/elearning.sh diff --git a/Moodle/PHP/enbatch_run.sh b/Moodle/SH/enbatch_run.sh similarity index 100% rename from Moodle/PHP/enbatch_run.sh rename to Moodle/SH/enbatch_run.sh diff --git a/Moodle/PHP/encreate_course.sh b/Moodle/SH/encreate_course.sh similarity index 100% rename from Moodle/PHP/encreate_course.sh rename to Moodle/SH/encreate_course.sh diff --git a/Moodle/PHP/encreatecourse.sh b/Moodle/SH/encreatecourse.sh similarity index 100% rename from Moodle/PHP/encreatecourse.sh rename to Moodle/SH/encreatecourse.sh diff --git a/Moodle/PHP/english.sh b/Moodle/SH/english.sh similarity index 100% rename from Moodle/PHP/english.sh rename to Moodle/SH/english.sh diff --git a/Moodle/PHP/genmedia.sh b/Moodle/SH/genmedia.sh similarity index 100% rename from Moodle/PHP/genmedia.sh rename to Moodle/SH/genmedia.sh diff --git a/Moodle/PHP/genmedia.v.1.sh b/Moodle/SH/genmedia.v.1.sh similarity index 100% rename from Moodle/PHP/genmedia.v.1.sh rename to Moodle/SH/genmedia.v.1.sh diff --git a/Moodle/PHP/genmp3.sh b/Moodle/SH/genmp3.sh similarity index 100% rename from Moodle/PHP/genmp3.sh rename to Moodle/SH/genmp3.sh diff --git a/Moodle/PHP/gets.sh b/Moodle/SH/gets.sh similarity index 100% rename from Moodle/PHP/gets.sh rename to Moodle/SH/gets.sh diff --git a/Moodle/PHP/gettext.sh b/Moodle/SH/gettext.sh similarity index 100% rename from Moodle/PHP/gettext.sh rename to Moodle/SH/gettext.sh diff --git a/Moodle/PHP/hsphnline.sh b/Moodle/SH/hsphnline.sh similarity index 100% rename from Moodle/PHP/hsphnline.sh rename to Moodle/SH/hsphnline.sh diff --git a/Moodle/PHP/hsphonline.sh b/Moodle/SH/hsphonline.sh similarity index 100% rename from Moodle/PHP/hsphonline.sh rename to Moodle/SH/hsphonline.sh diff --git a/Moodle/PHP/objonline.sh b/Moodle/SH/objonline.sh similarity index 100% rename from Moodle/PHP/objonline.sh rename to Moodle/SH/objonline.sh diff --git a/Moodle/PHP/online.sh b/Moodle/SH/online.sh similarity index 100% rename from Moodle/PHP/online.sh rename to Moodle/SH/online.sh diff --git a/Moodle/PHP/removeblank.sh b/Moodle/SH/removeblank.sh similarity index 100% rename from Moodle/PHP/removeblank.sh rename to Moodle/SH/removeblank.sh diff --git a/Moodle/PHP/rename_topics.sh b/Moodle/SH/rename_topics.sh similarity index 100% rename from Moodle/PHP/rename_topics.sh rename to Moodle/SH/rename_topics.sh diff --git a/Moodle/PHP/rescan-scsi-bus.sh b/Moodle/SH/rescan-scsi-bus.sh similarity index 100% rename from Moodle/PHP/rescan-scsi-bus.sh rename to Moodle/SH/rescan-scsi-bus.sh diff --git a/Moodle/SH/scan.sh b/Moodle/SH/scan.sh new file mode 100644 index 0000000..ff01b6a --- /dev/null +++ b/Moodle/SH/scan.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Thư mục gốc của khóa học +COURSE_FOLDER="$(pwd)" + +# Tìm tất cả các thư mục con +mapfile -t DIRS < <(find "$COURSE_FOLDER" -type d) + +for dir in "${DIRS[@]}"; do + relative_path="${dir#*/vod/}" + OUTPUT_JSON="$dir/filelist.txt" + + # Xóa tệp mdl.media cũ nếu tồn tại + rm -f "$OUTPUT_JSON" + + # Tìm và sắp xếp các file .pdf và .xlsx theo thứ tự tự nhiên + mapfile -d '' -t FILES < <(find "$dir" -maxdepth 1 -type f \( -name '*.pdf' -o -name '*.xlsx' \) -print0 | sort -z -V) + + for file in "${FILES[@]}"; do + filename=$(basename "$file") + vid="$relative_path/$filename" + echo "$vid" >> "$OUTPUT_JSON" + done + + echo "File filelist.txt created successfully in $dir." +done diff --git a/Moodle/SH/scan1.sh b/Moodle/SH/scan1.sh new file mode 100644 index 0000000..9a26229 --- /dev/null +++ b/Moodle/SH/scan1.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +COURSE_FOLDER="$(pwd)" + +# Kiểm tra tham số +if [ -z "$1" ]; then + echo "Usage: $0 ext1,ext2,..." + exit 1 +fi + +# Tạo mảng extension +IFS=',' read -ra EXT_ARRAY <<< "$1" + +# Quét tất cả thư mục con +mapfile -t DIRS < <(find "$COURSE_FOLDER" -type d) + +for dir in "${DIRS[@]}"; do + relative_path="${dir#*/vod/}" + OUTPUT_FILE="$dir/filelist.txt" + rm -f "$OUTPUT_FILE" + + # Duyệt tất cả file trong thư mục + for file in "$dir"/*; do + [ -f "$file" ] || continue + filename=$(basename "$file") + ext="${filename##*.}" + # Kiểm tra extension có trong danh sách không + for allowed_ext in "${EXT_ARRAY[@]}"; do + if [[ "${ext,,}" == "${allowed_ext,,}" ]]; then # ignore case + echo "$relative_path/$filename" >> "$OUTPUT_FILE" + break + fi + done + done + + # Sắp xếp tự nhiên filelist.txt + if [ -s "$OUTPUT_FILE" ]; then + sort -V -o "$OUTPUT_FILE" "$OUTPUT_FILE" + echo "File filelist.txt created successfully in $dir." + fi +done