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

تازه کار => انجمن تازه‌کاران => نویسنده: fzk007 در 20 امرداد 1394، 05:05 ب‌ظ

عنوان: نمایش تعداد و سایز فایل ها و دایرکتوری ها در دایرکتوری جاری
ارسال شده توسط: fzk007 در 20 امرداد 1394، 05:05 ب‌ظ
سلام دوستان
میخوام یک برنامه بنویسم که خروجی زیر رو چاپ کنه:

- لیست فایل های موجود، تعداد آنها در مجموع در دایرکتوری جاری
- لیست دایرکتوری های موجود و تعداد آنها در دایرکتوری جاری
- حجم کل فایل ها (حتی الامکان به فرمت 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 در 20 امرداد 1394، 05:43 ب‌ظ
میتونید از ls -F استفاده کنید . که آخر دایرکتوری ها یک / میزاره . بعد با یه کاری مثل این :
ls | egrep "/$"
دایرکتوری ها رو جدا میکنید . با wc -l میتونید خطوط رو بشمارید . الان این :
ls | egrep "/$" | wc -l میاد دایکرکتوری ها رو میشماره .
سوییچ -v برعکس میکنه . یعنی :
ls | egrep  -v "/$"اون هایی که آخرشون / نیست رو نشون میده که احتمالا همون فایل ها هستند .
دستور du هم حجم فایل ها رو میگه که با سوییچ h- میتونید به صورت (human readable) ببینیدشون .
در آخر نتایج دستور du ، حجم کل فایل ها دایرکتوی جاری رو نشون میده .
برای اینکه فقط یک لایه از فایل ها رو ببینید از این سوییچ استفاده کنید :
du  --max-depth=1یعنی اینکه مثلا شما میخواین حجم فایل ها دایرکتوی / رو ببینید . خب داخل این دایرکتوری دایرکتوری home هم هست که یکسری فایل توشه ، با این سوییچ دیگه فایل های داخل اون رو نمایش نمیده و فقط یک لایه از فایل ها رو نشون میده .
عنوان: پاسخ : نمایش تعداد و سایز فایل ها و دایرکتوری ها در دایرکتوری جاری
ارسال شده توسط: QSBuntu در 20 امرداد 1394، 05:43 ب‌ظ
این توضیح رومیدم که اگه نیاز شد بتونی تو برنامه تون ازش استفاده کنید  (از اول بگم توضیحم لزوما جواب سوالاتون نیست)
برای اینکه بتونید روی تک تک خروجی های یک دستور ، دستور دیگه ای را اجرا کنید کافیست از پایپ و دستور ایکس آرگز استفاده کنید
مثال میخایم توی یک دایرکتوری (مثل /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 در 20 امرداد 1394، 06:31 ب‌ظ
از هردوتون ممنونم دوستان عزیز :)

عنوان: پاسخ : نمایش تعداد و سایز فایل ها و دایرکتوری ها در دایرکتوری جاری
ارسال شده توسط: بهنام … در 20 امرداد 1394، 06:36 ب‌ظ
سلام. گزینه‌های خود find خیلی می‌تونند کمکت کنند. این شکلی:
‎find <DIRECTORY> -type f تنها پرونده‌ها و ‎-type d تنها پوشه‌ها را پیدا می‌کنه، سپس با دستوراتی که دوستان گفتند اونا را می‌شماری یا اندازه‌گیری می‌کنی
عنوان: پاسخ : نمایش تعداد و سایز فایل ها و دایرکتوری ها در دایرکتوری جاری
ارسال شده توسط: fzk007 در 20 امرداد 1394، 06:40 ب‌ظ

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

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