كيف يمكنني سرد اسم ملف واحد لكل خط إخراج في Linux؟
سؤال
أنا استخدم ls -a
أمر للحصول على أسماء الملفات في دليل ، ولكن الإخراج في سطر واحد.
مثله:
. .. .bash_history .ssh updater_error_log.txt
أحتاج إلى بديل مدمج للحصول على أسماء الملفات ، كل على خط جديد ، مثل هذا:
.
..
.bash_history
.ssh
updater_error_log.txt
المحلول
استخدم ال -1
الخيار (لاحظ أن هذا رقم "واحد" ، وليس حرفًا صغيرًا "L") ، مثل هذا:
ls -1a
أولا ، على الرغم من ذلك ، تأكد من ls
يدعم -1
. Gnu CoreUtils (مثبتة على أنظمة Linux القياسية) و Solaris Do ؛ ولكن إذا كنت في شك ، فاستخدم man ls
أو ls --help
أو تحقق من الوثائق. على سبيل المثال:
$ man ls
...
-1 list one file per line. Avoid '\n' with -q or -b
نصائح أخرى
نعم ، يمكنك القيام به بسهولة ls
إخراج اسم ملف لكل سطر:
ls -a | cat
Explanation: الأمر ls
الحواس إذا كان الإخراج إلى محطة أو إلى ملف أو أنبوب ويتعديل وفقًا لذلك.
لذلك ، إذا كنت الأنابيب ls -a
إلى Python يجب أن تعمل دون أي تدابير خاصة.
تم تصميم LS للاستهلاك البشري ، و يجب أن لا تحذر مخرجاتها.
في البرامج النصية Shell ، هناك بعض الحالات التي يعمل فيها تحليل إخراج LS هو أبسط طريقة لتحقيق التأثير المطلوب. نظرًا لأن LS قد تقوم بتشغيل أحرف غير ASCII والتحكم في أسماء الملفات ، فإن هذه الحالات هي مجموعة فرعية من الحالات التي لا تتطلب الحصول على اسم ملف من ls
.
في بيثون ، لا يوجد أي سبب على الإطلاق للاستدعاء ls
. بيثون لديه كل من ls
وظيفة مدمجة. يستخدم os.listdir
لسرد محتويات الدليل و os.stat
أو os
للحصول على بيانات تعريف الملف. وظائف أخرى في os
من المحتمل أن تكون الوحدات ذات صلة بمشكلتك أيضًا.
إذا كنت تصل إلى الملفات البعيدة عبر SSH ، فإن طريقة قوية بشكل معقول لإدراج أسماء الملفات هي من خلال SFTP:
echo ls -1 | sftp remote-site:dir
هذا يطبع اسم ملف واحد لكل سطر ، وعلى عكس ls
خدمة، sftp
لا يدير شخصيات غير قابلة للطباعة. لن تتمكن من إدراج الدلائل بشكل موثوق حيث يحتوي اسم الملف على سطر جديد ، ولكن نادراً ما يتم ذلك (تذكر هذا كمسألة أمان محتملة ، وليس مشكلة قابلية الاستخدام).
في Python (حذار يجب أن تهرب Metacharacters remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
للحصول على تفاعلات أكثر تعقيدًا ، ابحث عن وضع دفعة SFTP في الوثائق.
على بعض الأنظمة (Linux ، Mac OS X ، وربما بعض الوحدات الأخرى ، ولكن بالتأكيد ليس Windows) ، فإن طريقة مختلفة هي تركيب نظام ملفات عن بُعد من خلال SSH مع SSHFS, ، ثم العمل محليا.
يمكنك استخدام ls -1
ls -l
سيقوم أيضًا بالعمل
سهل ، طالما أن أسماء الملفات لا تتضمن الخطوط الجديدة:
find . -maxdepth 1
إذا كنت تقوم بتنشيط هذا إلى أمر آخر ، فربما تفضل فصل أسماء الملفات الخاصة بك عن طريق البايتات الفارغة ، بدلاً من الخطوط الجديدة ، نظرًا لأن البايتات الفارغة لا يمكن أن تحدث في اسم ملف (ولكن قد تكون الخطوط الجديدة):
find . -maxdepth 1 -print0
من المحتمل أن يتم عرض طباعة ذلك على المحطة كخط واحد ، لأنه لا يتم طباعة البايتات الفارغة بشكل طبيعي. قد تحتاج بعض البرامج إلى خيار محدد للتعامل مع المدخلات الفارغة ، مثل sort
'س -z
. السيناريو الخاص بك بالمثل سوف يحتاج إلى حساب ذلك.