قائمة الملفات بشكل متكرر في لينكس CLI مع مسار نسبة إلى الدليل الحالي
سؤال
وهذا هو مماثل ل<لأ href = "https://stackoverflow.com/questions/105212/linux-recursively-list-all-files-in-a-directory-including-files-in-symlink-dire" > هذا السؤال ، ولكن أريد أن تضمين المسار نسبة إلى الدليل الحالي في يونكس. إذا كنت تفعل ما يلي:
ls -LR | grep .txt
وولكنها لا تشمل مسارات الكاملة. على سبيل المثال، لدي بنية الدليل التالي:
test1/file.txt
test2/file1.txt
test2/file2.txt
ورمز أعلاه سيعود:
file.txt
file1.txt
file2.txt
وكيف يمكنني الحصول عليه لتشمل المسارات النسبية إلى الدليل الحالي باستخدام الأوامر القياسية يونكس؟
المحلول
استخدم تجد:
find . -name \*.txt -print
في الأنظمة التي تستخدم GNU العثور عليها، مثل معظم توزيعات جنو / لينكس، يمكنك ترك خارج -print.
نصائح أخرى
استخدم tree
، مع -f
(المسار الكامل) و-i
(لا خطوط المسافة البادئة):
tree -if --noreport .
tree -if --noreport directory/
ويمكنك بعد ذلك استخدام grep
لتصفية تلك التي تريد.
إذا لم يتم العثور على الأوامر، يمكنك تثبيته:
واكتب الأمر التالي لتثبيت قيادة شجرة على RHEL / سينت أو إس وفيدورا لينكس:
# yum install tree -y
إذا كنت تستخدم ديبيان / أوبونتو، نوع النعناع لينكس الأمر التالي في الطرفية الخاص بك:
$ sudo apt-get install tree -y
وحاول find
. يمكنك أن تبحث عنه بالضبط في الصفحة الرجل، ولكن هذا شيء على مثل هذا:
وfind [start directory] -name [what to find]
وذلك على سبيل المثال الخاص بك
وfind . -name "*.txt"
ويجب أن تعطيك ما تريد.
هل يمكن استخدام تجد بدلا من ذلك:
find . -name '*.txt'
وهذا لا حيلة:
وls -R1 $PWD | while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done | grep -i ".txt"
ولكن من يفعل ذلك من قبل "آثم" مع إعراب ls
، على الرغم من، والذي يعتبر النموذج السيئ من قبل المجتمعات GNU وغوستسكريبت.
DIR=your_path
find $DIR | sed 's:""$DIR""::'
و"الحوار الاقتصادي الاستراتيجي" سوف يمحو "your_path" من كل "العثور على 'النتائج. وأنت تستلم نسبة إلى المسار 'DIR ".
للحصول على أسماء الملفات المسار الكامل الفعلية للملفات المطلوبة باستخدام الأمر find، واستخدامها مع الأمر الأشخاص ذوي الإعاقة:
find $(pwd) -name \*.txt -print
وهنا هو السيناريو بيرل:
sub format_lines($)
{
my $refonlines = shift;
my @lines = @{$refonlines};
my $tmppath = "-";
foreach (@lines)
{
next if ($_ =~ /^\s+/);
if ($_ =~ /(^\w+(\/\w*)*):/)
{
$tmppath = $1 if defined $1;
next;
}
print "$tmppath/$_";
}
}
sub main()
{
my @lines = ();
while (<>)
{
push (@lines, $_);
}
format_lines(\@lines);
}
main();
والاستعمال:
ls -LR | perl format_ls-LR.pl
هل يمكن إنشاء دالة قذيفة، على سبيل المثال في .zshrc
أو الخاص .bashrc
:
filepath() {
echo $PWD/$1
}
filepath2() {
for i in $@; do
echo $PWD/$i
done
}
وسيكون أول واحد يعمل على صورة واحدة فقط، ومن الواضح.
وابحث عن ملف يسمى "اسم الملف" على الملفات الخاصة بك بدء البحث من الدليل الجذر "/". في "اسم الملف"
find / -name "filename"
إذا كنت تريد الحفاظ على تفاصيل تأتي مع ليرة سورية مثل حجم الملف وغيرها في الإخراج الخاص بك ثم وهذا يجب أن تعمل.
sed "s|<OLDPATH>|<NEWPATH>|g" input_file > output_file
ويمكنك تنفيذ هذه الوظيفة مثل هذا
أولا، وذلك باستخدام الأمر ls أشار إلى الدليل المحدد لها. في وقت لاحق باستخدام الأمر find تصفية نتيجة منه.
من قضيتك، فإنه يبدو وكأنه - دائما يبدأ اسم الملف مع كلمة
file***.txt
ls /some/path/here | find . -name 'file*.txt' (* represents some wild card search)