كيف يمكنني سرد ​​اسم ملف واحد لكل خط إخراج في Linux؟

StackOverflow https://stackoverflow.com/questions/3886295

  •  28-09-2019
  •  | 
  •  

سؤال

أنا استخدم 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. السيناريو الخاص بك بالمثل سوف يحتاج إلى حساب ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top