أمر LS: كيف يمكنني الحصول على قائمة متكررة كاملة المسار ، سطر واحد لكل ملف؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

كيف يمكنني الحصول على LS لإخراج قائمة مسطحة من المسارات المتكررة لكل خط؟

على سبيل المثال ، أريد فقط قائمة مسطحة للملفات مع مساراتها الكاملة:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 تقريبًا ما أحتاجه ، لكنني لا أريد شظايا المسار ، أريد مسارات كاملة.

هل كانت مفيدة؟

المحلول

إذا كنت تريد حقًا استخدامها ls, ، ثم تنسيق إخراجها باستخدام AWK:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'

نصائح أخرى

استخدم البحث:

find .
find /home/dreftymac

إذا كنت تريد الملفات فقط (حذف الدلائل والأجهزة وما إلى ذلك):

find . -type f
find /home/dreftymac -type f

ls -ld $(find .)

إذا كنت ترغب في فرز الإخراج الخاص بك عن طريق التعديل:

ls -ltd $(find .)

جرب الطريقة أبسط التالية:

find "$PWD"

أفضل أمر هو: tree -fi

من أجل استخدام الملفات ولكن ليس الروابط ، يجب عليك إزالة > من إخراجك:

tree -fi |grep -v \>

إذا كنت تريد معرفة طبيعة كل ملف ، (لقراءة ملفات ASCII فقط على سبيل المثال) مع اثنين whileس:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done

أوه ، حقا قائمة طويلة من الإجابات. لقد ساعد ذلك كثيرًا ، وأخيراً ، قمت بإنشاء خاص بي الذي كنت أبحث عنه:

لسرد جميع الملفات في الدليل ومخرجه الفرعي:

find "$PWD" -type f

لإدراج جميع الدلائل في الدليل ومخرجه الفرعي:

find "$PWD" -type d

لإدراج جميع الدلائل والملفات في الدليل ومخرجه الفرعي:

find "$PWD"

لا أعرف عن المسار الكامل ، ولكن يمكنك استخدامه -R للتكرار. بدلاً من ذلك ، إذا لم تكن عازمًا ls, ، يمكنك فقط القيام به find *.

باستخدام أي أوامر خارجية غير LS:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done

du -a

مفيد لبعض قذائف الأجهزة المحدودة حيث لا تتوفر Find/Mortate.

البحث / سوف يقوم بالخدعة

أفكر في قائمة مسطحة أفضل طريقة هي:

find -D tree /fullpath/to-dir/ 

(أو من أجل حفظه في ملف TXT)

find -D tree /fullpath/to-dir/ > file.txt

لا تجعل الأمر معقدًا. لقد استخدمت هذا للتو وحصلت على ناتج جميل:

ls -lR /path/I/need

أسهل طريقة لجميع الناس في المستقبل هي ببساطة:

du

ومع ذلك ، فإن هذا يوضح أيضًا حجم ما وارد في كل مجلد ، يمكنك استخدام AWK لإخراج اسم المجلد فقط:

du | awk '{print $2}'

تحرير- آسف ، سيئتي. اعتقدت أنها كانت فقط المجلدات التي كانت مطلوبة. سأترك هذا هنا في حالة احتياج أي شخص في المستقبل على أي حال ...

مع وجود حرية استخدام جميع خيارات LS الممكنة:

find -type f | xargs ls -1

قم بتشغيل أمر باش بالتنسيق التالي:

find /path -type f -exec ls -l \{\} \;

فيما يلي إجابة جزئية تعرض أسماء الدليل.

ls -mR * | sed -n 's/://p'

تفسير:

ls -mR * يسرد أسماء الدليل الكاملة التي تنتهي في ":" ، ثم يسرد الملفات في هذا الدليل بشكل منفصل

sed -n 's/://p' يجد خطوطًا تنتهي في القولون ، وتجريد القولون وطباعة الخط

من خلال التكرار على قائمة الدلائل ، يجب أن نكون قادرين على العثور على الدلائل أيضًا. لا يزال يعمل على ذلك. إنه تحدٍ للحصول على أحرف البرية من خلال XARGS.

إضافة بطاقة برية إلى نهاية دليل LS قوات المسارات الكاملة. الآن لديك هذا:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

يمكنك القيام بذلك بدلاً من ذلك:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

لسوء الحظ ، لا يطبع هذا المسار الكامل للدلائل التي تم تراجعها ، لذلك قد لا يكون الحل الكامل الذي تبحث عنه.

ls -lR هو ما كنت تبحث عنه ، أو على الأقل كنت. في صحتك

الكثير من الإجابات التي أراها. هذا لي ، وأعتقد أنه مفيد للغاية إذا كنت تعمل على Mac.

أنا متأكد من أنك تعرف أن هناك بعض ملفات "الحزمة" (.برنامج, .rtfd, . العمل, ، وهلم جرا). والنظر إلى نافذة Finder يبدو أنها ملفات واحدة. لكنهم ليسوا كذلك. و $ ls أو $ find شاهدهم كدليل ... لذا ، إلا إذا كنت بحاجة إلى قائمة محتوياتهم أيضًا ، فهذا يعمل بالنسبة لي:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

بالطبع هذا مخصص للتشغيل ، ويمكنك إضافة ملحقات حزم أخرى (ولكن دائمًا مع أ / بعدهم). أو أي ملحقات أخرى إن لم تكن حزمة بدون /.

من المثير للاهتمام "".lpdf/"(PDF متعدد اللغات). إنه طبيعي".pdf"الامتداد (!!) أو لا شيء في Finder. وبهذه الطريقة تحصل (أو أنها تعتبر ملفًا واحدًا فقط) لهذا الغرض pdf وليس حفنة من الأشياء ...

إذا تم تمرير الدليل كمسار نسبي وستحتاج إلى تحويله إلى مسار مطلق قبل الاتصال. في المثال التالي ، يتم تمرير الدليل كمعلمة أول إلى البرنامج النصي:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
tar cf - $PWD|tar tvf -             

هذا بطيء ولكنه يعمل بشكل متكرر ويطبع كل من الدلائل والملفات. يمكنك تنشيطه باستخدام AWK/GREP إذا كنت تريد فقط أسماء الملفات بدون جميع المعلومات/الدلائل الأخرى:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          

@ghostdog74: تعديل صغير مع الحل الخاص بك.
يمكن استخدام التعليمات البرمجية التالية للبحث في الملف مع المسار المطلق الكامل.

sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]

كنت أعرف اسم الملف لكنني أردت الدليل أيضًا.

العثور على $ pwd | اسم الملف FGREP

عملت بشكل مثالي في Mac OS 10.12.1

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