انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: نمایش تعداد و سایز فایل ها و دایرکتوری ها در دایرکتوری جاری  (دفعات بازدید: 988 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین fzk007

  • Newbie
  • *
  • ارسال: 20
  • جنسیت : دختر
سلام دوستان
میخوام یک برنامه بنویسم که خروجی زیر رو چاپ کنه:

- لیست فایل های موجود، تعداد آنها در مجموع در دایرکتوری جاری
- لیست دایرکتوری های موجود و تعداد آنها در دایرکتوری جاری
- حجم کل فایل ها (حتی الامکان به فرمت human readable)
- حجم کل دایرکتوری ها (حتی الامکان به فرمت human readable)

فرمت خروجی برای نمونه به شکل زیر باشه:

[File] f1.txt
[File] f2.sh
[File] f3.conf
[Dir] dir1
[Dir] dir2
Total files: 3
Total directories: 2
Total size of file: 940
Total size of directories: 2360

به نظر خودم برای این کار باید از ls -l استفاده کنم بعد با cut -c 1 می تونم کاراکتر اول خروجی ls و جدا کنم که بهم میگه فایل هست یا دایرکتوری ولی نمیدونم چطور میتونم تک تک برای همه فایل ها این کارو بکنم چون ls یکبار همه رو لیست میکنه، نمیدونم چطور باید بشمارمشون. اگر که راهنمایی کنید ممنون میشم.

آفلاین koosha

  • Hero Member
  • *
  • ارسال: 734
  • جنسیت : پسر
میتونید از ls -F استفاده کنید . که آخر دایرکتوری ها یک / میزاره . بعد با یه کاری مثل این :
ls | egrep "/$"
دایرکتوری ها رو جدا میکنید . با wc -l میتونید خطوط رو بشمارید . الان این :
ls | egrep "/$" | wc -l میاد دایکرکتوری ها رو میشماره .
سوییچ -v برعکس میکنه . یعنی :
ls | egrep  -v "/$"اون هایی که آخرشون / نیست رو نشون میده که احتمالا همون فایل ها هستند .
دستور du هم حجم فایل ها رو میگه که با سوییچ h- میتونید به صورت (human readable) ببینیدشون .
در آخر نتایج دستور du ، حجم کل فایل ها دایرکتوی جاری رو نشون میده .
برای اینکه فقط یک لایه از فایل ها رو ببینید از این سوییچ استفاده کنید :
du  --max-depth=1یعنی اینکه مثلا شما میخواین حجم فایل ها دایرکتوی / رو ببینید . خب داخل این دایرکتوری دایرکتوری home هم هست که یکسری فایل توشه ، با این سوییچ دیگه فایل های داخل اون رو نمایش نمیده و فقط یک لایه از فایل ها رو نشون میده .
« آخرین ویرایش: 20 امرداد 1394، 05:51 ب‌ظ توسط koosha »
GNU/Linux
Debian8
I3 WM

آفلاین QSBuntu

  • High Sr. Member
  • *
  • ارسال: 613
  • جنسیت : پسر
این توضیح رومیدم که اگه نیاز شد بتونی تو برنامه تون ازش استفاده کنید  (از اول بگم توضیحم لزوما جواب سوالاتون نیست)
برای اینکه بتونید روی تک تک خروجی های یک دستور ، دستور دیگه ای را اجرا کنید کافیست از پایپ و دستور ایکس آرگز استفاده کنید
مثال میخایم توی یک دایرکتوری (مثل /lib) همه ی فایل های دارای mo رو پیداکنم
دستور و خروجی :
find -maxdepth 2 -mindepth 1 -name "*mo*"./fglrx/core-modprobe.conf
./x86_64-linux-gnu/libmount.so.1.1.0
./x86_64-linux-gnu/libmount.so.1
./x86_64-linux-gnu/libsystemd-daemon.so.0.0.10
./x86_64-linux-gnu/libkmod.so.2.2.5
./x86_64-linux-gnu/libsystemd-daemon.so.0
./x86_64-linux-gnu/libkmod.so.2
./x86_64-linux-gnu/plymouth
./init/apparmor-profile-load
./udev/usb_modeswitch
./modprobe.d
./firmware/moxa
./apparmor
./recovery-mode
./recovery-mode/recovery-mode
./modules
./linux-sound-base/noOSS.modprobe.conf
./linux-sound-base/noALSA.modprobe.conf
./modules-load.d
./plymouth

حالا میخام برای تک تک اینا چاپ کنه که اسم این فایل اینه (بی مزه اس ولی میخام فقط نحوه کاربرد دستور رو نشون بدم)
دستور:
find -maxdepth 2 -mindepth 1 -name "*mo*" | xargs -i echo "this name is ".'{}'
خروجی:
this name is ../fglrx/core-modprobe.conf
this name is ../x86_64-linux-gnu/libmount.so.1.1.0
this name is ../x86_64-linux-gnu/libmount.so.1
this name is ../x86_64-linux-gnu/libsystemd-daemon.so.0.0.10
this name is ../x86_64-linux-gnu/libkmod.so.2.2.5
this name is ../x86_64-linux-gnu/libsystemd-daemon.so.0
this name is ../x86_64-linux-gnu/libkmod.so.2
this name is ../x86_64-linux-gnu/plymouth
this name is ../init/apparmor-profile-load
this name is ../udev/usb_modeswitch
this name is ../modprobe.d
this name is ../firmware/moxa
this name is ../apparmor
this name is ../recovery-mode
this name is ../recovery-mode/recovery-mode
this name is ../modules
this name is ../linux-sound-base/noOSS.modprobe.conf
this name is ../linux-sound-base/noALSA.modprobe.conf
this name is ../modules-load.d
this name is ../plymouth
با wc هم میتونی نتیجه دستور رو بشماری
find -maxdepth 2 -mindepth 1 -name "*mo*"|wc
     20      20     536
یا میتونی بعد از پایپ دستور زیر رو بدی تا برات از نتایج لیست بگیره:
xargs -i ls -ltrhs '{}'


بهر حال چیزهایی که مهم هستند اینان:
xargs -i برای فرستادن نتایج به صورت تک تک
'{}'   اینم نشون دهنده مکانیه که قراره نتیجه دستور قبل اونجا بشینه

زندگی خواهم کرد... خواهم زیست ... و میجنگم حتی اگر........................

آفلاین fzk007

  • Newbie
  • *
  • ارسال: 20
  • جنسیت : دختر
از هردوتون ممنونم دوستان عزیز :)


آفلاین بهنام …

  • High Hero Member
  • *
  • ارسال: 1028
  • إن أحسنتم أحسنتم لأنفسكم وإن أسأتم فلها
سلام. گزینه‌های خود find خیلی می‌تونند کمکت کنند. این شکلی:
‎find <DIRECTORY> -type f تنها پرونده‌ها و ‎-type d تنها پوشه‌ها را پیدا می‌کنه، سپس با دستوراتی که دوستان گفتند اونا را می‌شماری یا اندازه‌گیری می‌کنی
:) :)

آفلاین fzk007

  • Newbie
  • *
  • ارسال: 20
  • جنسیت : دختر

بهر حال چیزهایی که مهم هستند اینان:
xargs -i برای فرستادن نتایج به صورت تک تک
'{}'   اینم نشون دهنده مکانیه که قراره نتیجه دستور قبل اونجا بشینه

[/quote]

یک سوال:
کنار xarg -i به جز دستور echo چه دستوراتی میتونه قرار بگیره مثلا می تونم از if هم استفاده کنم یا نه؟
چون من برای هر خط از خروجی باید یک شرط رو چک کنم.