كيف يمكنني إنشاء قائمة بالملفات بمسارها المطلق في Linux؟

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

سؤال

أنا أكتب برنامج نصي شل يأخذ مسارات الملفات كمدخلات.

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

/home/ken/foo/bar

ولكن، بقدر ما أستطيع أن أرى، على حد سواء ls و find إعطاء قوائم المسار النسبي فقط:

./foo/bar   (from the folder ken)

يبدو وكأنه مطلب واضح، ولكن لا أستطيع أن أرى أي شيء في find أو ls صفحات الرجل.

كيف يمكنني إنشاء قائمة بالملفات الموجودة في الصدفة بما في ذلك مساراتها المطلقة؟

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

المحلول

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

find "$(pwd)" -name .htaccess

وأو إذا كان لديك قذيفة توسع $PWD إلى الدليل الحالي:

find "$PWD" -name .htaccess

وfind ببساطة بإلحاق الطريق إلى أنه تم إعطاء مسار نسبي إلى ملف من هذا الطريق.

جريج Hewgill واقترح أيضا باستخدام pwd -P إذا كنت ترغب في حل روابط الرمزية في الدليل الحالي.

نصائح أخرى

readlink -f filename 

ويعطي المسار المطلق الكامل. ولكن إذا كان الملف هو الارتباط الرمزي، ش سوف تحصل على اسم حل نهائي.

استخدم هذا لتطبيق الاستعراض المفصل (هناك حاجة / بعد ** في باش للحد من أن الدلائل):

ls -d -1 "$PWD/"**/

وهذه الملفات والدلائل مباشرة تحت الدليل الحالي، التي تحتوي على أسماء .:

ls -d -1 "$PWD/"*.*

وهذا كل شيء:

ls -d -1 "$PWD/"**/*

والمحصلة من هنا    http://www.zsh.org/mla/users/2002/msg00033.html

في باش، ** هو العودية إذا قمت بتمكين shopt -s globstar.

ويمكنك استخدام

find $PWD 

وفي باش

ls -d "$PWD/"*

وهذا يبدو فقط في الحالي الدليل. وتنقل "PWD $" في حال يحتوي على مسافات.

وو$PWD هو خيار جيد ماثيو أعلاه. إذا كنت تريد العثور على الملفات الطباعة فقط ثم يمكنك أيضا إضافة خيار و من نوع لبحث الملفات العادية فقط. خيارات أخرى هي "د" الدلائل فقط وما إلى ذلك في حالتك سيكون (اذا كنت تريد البحث فقط عن الملفات مع تحويلة .C):

find $PWD -type f -name "*.c" 

وأو إذا كنت تريد كل الملفات:

find $PWD -type f

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

إذا كنت تعطي تجد قيادة مسار مطلق، وسوف يبصقون نتائج خارجا مع مسار مطلق. لذلك، من الدليل كين لو كنت لاكتب:

find /home/ken/foo/ -name bar -print    

و(بدلا من find . -name bar -print مسار نسبي)

ويجب أن تحصل على:

/home/ken/foo/bar

لذلك، إذا كنت ترغب في ls -l ولها أن تعيد المسار المطلق، يمكنك فقط اقول الأمر find للتنفيذ على ls -l على ما تراه.

find /home/ken/foo -name bar -exec ls -l {} ;\ 

ملحوظة: هناك مسافة بين {} و;

وستحصل على شيء مثل هذا:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

إذا لم تكن متأكدا من حيث يكون الملف، يمكنك دائما تغيير موقع البحث. طالما يبدأ مسار البحث مع "/"، وسوف تحصل على المسار المطلق في العودة. إذا كنت تبحث عن مكان (مثل /) أين أنت ذاهب للحصول على الكثير من الأخطاء تم رفض الإذن، ثم أوصي إعادة توجيه الخطأ المعياري حتى تتمكن من رؤية الواقع نتائج نجد:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

و(2> هو بناء الجملة للقذائف تنقلها وباش، ولكن لن تعمل مع شركة شل C، وقد عمل في قذائف أخرى أيضا، ولكن أعرف فقط للتأكد من أنه يعمل في الغدير وباش).

يأمر: ls -1 -d "$PWD/"*

سيعطي هذا المسارات المطلقة للملف كما هو موضح أدناه.

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

وهنا مثال ذلك بطباعة قائمة دون فترة اضافية والذي يوضح أيضا كيفية البحث عن مباراة الملف. ويساعد هذا الأمل:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

وسوف find / -print القيام بذلك

ls -1 | awk  -vpath=$PWD/ '{print path$1}'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top