أولا بارك الله فيك. جزاك الله خيرا
جميعا. 
لا توجد أي عبارة توحي أنني تعلمت الصدفة باش. و أنتهيت منها. أخذت دكتوراة.
إذًا لمَ نشرت هذا الموضوع؟ أليس لتتعلم؟ 
فلو قلت عن كل شيء «لستُ خبيرا؛ أنا مجرد مبتدئ» فقد يثبطك ذلك عن التعلم.
ولو قلت «أنا خبير؛ أنا أعلم كل شيء» فهذه بداية الجهل!
لا تصف نفسك بأنك مبتدئ، وإنما ”fake it till you make it“ — وأنت تعلم بالفعل.
ولا تفكر في «الانتهاء من تعلم» أي شيء؛ فهذا يعني أنك ستتوقف، والذي يعني بداية التردي. إنما اسعَ دوما وتعلم. واستمر في التعلم حتى آخر أيامك.
فمثلا أنا اليوم، بعد عقد من الزمان من بدء تعلم باش، واستخدامها أغلب الأيام، وكتابة بُريمجات كثيرة بها بعضها يزيد على ألف سطر، احتجت للتأكد من بعض الأشياء أثناء كتابتي الرسالة السابقة.
الفحص مختصر و يعمل. الهدف منه التحقق من الحالة التي ينتهي بها فقط. لا أريد اضافة if statement .
لم أفهم؛ ما معنى «الفحص» مع قولك «لا أريد اضافة if statement»؟ وماذا تفعل if هنا إذًا؟
[ -d $HOME/Downloads ]
if [ "$?" != 0 ]; then
mkdir -p $HOME/Downloads
fi
تكرار المسارات. لا أعتقد موجودة في المشاركة الأخيرة. لا أعرف عن أي واحدة تتحدث.
في مشاركتك الأخيرة، ثلاث مرات في الأسطر العشرة الأولى، تحديدا:
[ -d $HOME/Downloads ]
if [ "$?" != 0 ]; then
mkdir -p $HOME/Downloads
fi
SOURCE="/home/$USER/Downloads"
مرتان $HOME/Downloads ومرة في تعريف SOURCE.
اذا لم تسأل عن المجلدات قبل عملها سيعطي خطأ اذا كانت موجودة.
هذا إذا استخدمت mkdir وحده، أما إذا استخدمت mkdir -p مثلما فعلت في كلتا المشاركتين، فلن يعطي خطأ. وانظر وصف -p في man mkdir.
سطر حذف السماحات البيضاء. هذا ما أحتاجه فقط. أعرف أنه توجد طرق لحذف الرموز الأخرى. و حيل تجاوز المساحات البيضاء طويل.
لا أعلم عنك. ولكن لدي الكثير من الملفات التي في أسمائها أقواس هلالية. (لعل أشهرها تنزيل ملف بنفس اسم ملف آخر، فيضيف المتصفح لاسم الجديد (1).) وهذه مثلها مثل المسافات.
لا أن أدخل في النقاش فيه. ابحث stackoverflow . و أنظر عدد المشاركات حول المشكلة.
لهذا ذكرت لك حل الـ«٩٠٪». 
الذي لم تشير له. أن استخدام أداة find مع لاحقة exec و xargs أفضل في البحث و نقل الملفات.
صحيح. ولم أذكرها لسببين:
-
تريد نقل الملفات الظاهرة التي في مجلد التنزيلات مباشرةً، وليست التي في أي مجلد فرعي. فاستخدام توسيع الصدفة (مثل * أو *.mp4) أيسر في هذه الحالة من استخدام find . -maxdepth 1. وخصوصا أن find يحتاج أن يكون في صدر الأمر، فتكتبه أولا ثم تطلب من find نفسه تنفيذ ما تريد. أما أنماط التوسيع فمثلها مثل أسماء الملفات في الاستخدام؛ والتي لا تستخدم فيها إلا الصدفة العادية التي تعرفها.
-
استخدام find متقدم أكثر من الصدفة المجردة، فليس من الحكمة أن يسألك سائل عن الماضي البسيط أو المضارع البسيط في الإنجليزية، فتشرح له الـsubjunctive. فـfind هو لغة وحده، ويحتاج طريقة مختلفة في التعامل، عكس الأنماط التي تستخدم مثل أسماء الملفات تماما.
و أيضا اضافة خاصية لتحقق اذا كان هناك ملف بنفس الاسم.
أردت أن أذكرها فعلا لكن نسيت. وما أردت أن أذكره تحديدا هو استخدام mv --interactive (أو mv -i اختصارا) ليسألك قبل تغطية أي ملف له نفس الاسم (وهذا اختياري في الغالب)، أو استخدام mv --no-clobber (أو mv -n اختصارا) والذي يرفض تغطية أي ملف بغير سؤال (ويوجد خيار لتغطية أي ملف بغير سؤال أيضا؛ انظر man mv). بل إني أري أن خيار --interactive ضروري جدا حتى أني أجعل أوامر mv وcp وrm في صدفتي تستخدمه دوما بغير أن أكتبه (بـalias).
(والأفضل دائما عند كتابة البُريمجات تفضيل الخيارات الطويلة على القصيرة، مثل --interactive بدلا من -i.)
توجد أشاياء كثيرة . يحتاجها السكريبت.
صحيح. لكن هذه مهمتك! فأنت مستخدمه الأول.
لم أقل أنه الأفضل.
لا يوجد شيء اسمه «الأفضل» (بالألف واللام)! انظر إلى أي مشروع برمجي؛ نادر جدا أن تجد مشروعا يقول «لقد انتهينا؛ لا يوجد شيء يمكننا أن نحسّنه في هذا المشروع». نواة لينكس مثلا تصدر نسخة جديدة مستقرة كل ثلاثة أشهر. بل إن لغات البرمجة تصدر نسخا جديدة كل حين، حتى اللغات الأكثر جمودا مثل C، حتى Fortran، حتى COBOL!
عندك نسخة أفضل لسكريبت كامل . شاركها بالمجتمع.
«أفضل» في هذا السياق صفة «ذاتية» وليست «موضوعية». فالأفضل للبعض ليس الأفضل للكل.
الجزء الأخير لنقل الملفات بدون صيغة. أعرف أنها ليست الطريقة الأفضل. ولكنني جربتها. و تعمل. توجد طريقة باستخدام awk أو أداة exiftool
لم أقل أنها لن تعمل، ولم أتحدث عن الطريقة أصلا! ما قلته، بالنص، هو: «هذا الكود لن يعمل كما تريد أصلا! بل سينقل كل الملفات إلى مجلد البُريمجات». وذلك لأن شرط نقل الملفات هو [ -f "$f" ] && [ $? == 0 ]، وهذا الشرط متحقق لجميع الملفات، بغض النظر عن ناتج grep السابق. وقد جربت نسخة مصغرة من هذا الكود أثناء كتابتي الرسالة السابقة، وجربت نسخة مصغرة أخرى أثناء كتابتي هذه الرسالة الآن؛ هذا الكود ينقل الملفات بالاعتماد على صدق الشرط [ -f "$f" ] وحده: أي أنه ينقل جميع الملفات بغض النظر عن نوع ما فيها.
و طريقة case esac أفضل في التعامل مع صيغ الملفات.
صحيح، فـcase أداة قوية جدا في باش لتنفيذ كود اعتمادا على مطابقته لنصوص أو أنماط.
حرف i الزائد. رأيته بعد تسجيل الخروج من المجتمع. تركته لما بعد.
وماذا لو لم تره إلا بعد تنفيذ الكود؟
السكريبت سيعمل و لو كنت خارج مجلد التحميلات. عندك رسالة خطأ شاركها.
ضع الأمر pwd قبل سطر إزالة المسافات. وربما تود أيضا أن تشغل البُريمج باستخدام bash -x وليس bash فقط، فهذا يعطيك تفصيلا للأوامر التي ينفذها فترى ماذا يفعل وما الملفات التي يعمل عليها.
لا ينقل هذا البُريمج الملفات إلا من المجلد الحالي. فإذا كنت في مجلد المنزل فسينقل ملفات مجلد المنزل إلى تلك المجلدات التي أنشأتها داخل مجلد التنزيلات.
مثال لاستخدام أداة find.
صحيح. وجميل أنك وصلت إليه. 
تم اضافة لاحقة n- الى أداة mv .
اختيار موفق. 