كيف يمكنني اختبار ما إذا كانت قائمة الملفات موجودة؟
-
02-07-2019 - |
سؤال
لدي ملف يسرد أسماء الملفات، كل منها في سطر خاص به، وأريد اختبار ما إذا كان كل منها موجودًا في دليل معين.على سبيل المثال، قد تكون بعض خطوط عينة الملف
mshta.dll
foobar.dll
somethingelse.dll
الدليل الذي يهمني هو X:\Windows\System32\
, ، لذلك أريد معرفة ما إذا كانت الملفات التالية موجودة:
X:\Windows\System32\mshta.dll
X:\Windows\System32\foobar.dll
X:\Windows\System32\somethingelse.dll
كيف يمكنني القيام بذلك باستخدام موجه أوامر Windows؟أيضًا (بدافع الفضول) كيف يمكنني القيام بذلك باستخدام bash أو غلاف Unix آخر؟
المحلول
في cmd.exe، ل/و٪عامل في ( اسم الملف ) يفعل يأمر يجب أن يعطيك ما تريد.هذا يقرأ محتويات اسم الملف (ويمكن أن يكون هناك أكثر من اسم ملف واحد) سطرًا واحدًا في كل مرة، مع وضع السطر في %variable (أكثر أو أقل؛القيام بالمساعدة في موجه الأوامر).إذا لم يقدم أي شخص آخر نصًا للأوامر، فسأحاول.
يحرر:محاولتي لبرنامج نصي cmd.exe يقوم بالمطلوب:
@echo off
rem first arg is the file containing filenames
rem second arg is the target directory
FOR /F %%f IN (%1) DO IF EXIST %2\%%f ECHO %%f exists in %2
ملاحظة، البرنامج النصي أعلاه يجب يكون السيناريو.حلقة FOR في ملف .cmd أو .bat، لسبب غريب، يجب أن تحتوي على علامات مئوية مزدوجة قبل المتغير الخاص بها.
الآن، بالنسبة لبرنامج نصي يعمل مع bash|ash|dash|sh|ksh :
filename="${1:-please specify filename containing filenames}"
directory="${2:-please specify directory to check}
for fn in `cat "$filename"`
do
[ -f "$directory"/"$fn" ] && echo "$fn" exists in "$directory"
done
نصائح أخرى
سحق:
while read f; do
[ -f "$f" ] && echo "$f" exists
done < file.txt
for /f %i in (files.txt) do @if exist "%i" (@echo Present: %i) else (@echo Missing: %i)
في ويندوز:
type file.txt >NUL 2>NUL
if ERRORLEVEL 1 then echo "file doesn't exist"
(قد لا تكون هذه هي الطريقة الأفضل للقيام بذلك؛وهي طريقة أعرفها؛أنظر أيضا http://blogs.msdn.com/oldnewthing/archive/2008/09/26/8965755.aspx)
في باش:
if ( test -e file.txt ); then echo "file exists"; fi
ومع ذلك، يرجى ملاحظة أنه لا توجد طريقة لضمان ذرية العملية باستخدام أنظمة الملفات الافتراضية ضمن كل من Win32 و*nix.إذا قمت بالتحقق من وجود الملفات A وB وC، فمن المحتمل أن تكون هناك عملية أو خيط آخر قد حذف الملف A بعد اجتيازه وأثناء بحثك عن B وC.
أنظمة الملفات مثل المعاملات NTFS يمكن التغلب على هذا القيد.
أردت إضافة تعليق صغير إلى معظم الحلول المذكورة أعلاه.إنهم لا يختبرون فعليًا ما إذا كان هناك ملف معين موجود أم لا.إنهم يتحققون لمعرفة ما إذا كان الملف موجودًا ويمكنك الوصول إليه.من الممكن تمامًا وجود ملف في دليل ليس لديك إذن به، وفي هذه الحالة لن تتمكن من عرض الملف على الرغم من وجوده.