كيف يمكنني إنشاء قائمة بالملفات بمسارها المطلق في Linux؟
-
05-07-2019 - |
سؤال
أنا أكتب برنامج نصي شل يأخذ مسارات الملفات كمدخلات.
لهذا السبب، أحتاج إلى إنشاء قوائم ملفات متكررة بمسارات كاملة.على سبيل المثال، الملف 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}'