خطاهای پیش آمده در لینوکس و راه حل آنها

تجریبات بر طرف سازی خطاهای لینوکس

خطاهای پیش آمده در لینوکس و راه حل آنها

تجریبات بر طرف سازی خطاهای لینوکس

رفع مشکل -bash: /usr/bin/rm: Argument list too long

بر روی یک سرور قبلا اجراهایی صورت گرفته و فایل های زیادی تولید شده که باعث پر شدن کل فضای هارد سرور و از کار افتادن آن شده است.


پس از برگزاری جلسات با گروه مربوطه تصمیم به پاک کردن فایل های txt که دیگر مورد نیاز نبودند گرفتیم.

هنگامی که از دستور rm -rf استفاده کردم با پیام خطای زیر مواجه شدم.

-bash: /usr/bin/rm: Argument list too long


البته فقط دستور ls اجرا میشد.

ابتدا با دسته بندی کردن نام فایل ها به ترتیب آنها را حذف می کردم، اما این کار بسیار وقت گیر بود.


با جستجو در اینترنت به روش زیر رسیدم که بسیار عالی و سریع بود.

با دستور زیر حذف را به بلاک های 200 فایلی محدود می کنیم.


echo *.txt|xargs -n 200 rm -fv


می توان عدد 200 را زیادتر یا کمتر کرد که در هر بار حذف، همان تعداد را حذف می کند.


روشهایی برای فرمت دادن به خروجی به صورت عدد صحیح interger در bash

روش اول - 

$ padtowidth=3
$ for i in 0 {8..11} {98..101}; do printf "%0*d\n" $padtowidth $i; done
000
008
009
010
011
098
099
100
101

روش دوم- 

$ seq -s, -w 1 10
01,02,03,04,05,06,07,08,09,10

$ for i in `seq -w 95 105` ; do echo -n " $i" ; done
095 096 097 098 099 100 101 102 103 104 105

روش سوم-این روش با bash ,ورژن 4 کار میکند

echo {01..100} # 001 002 003 ...
echo {03..100..3} # 003 006 009 ...

روش چهارم-

#!/bin/bash

max=100; 

for ((i=1;i<=$max;i++)); do 
    printf "%0*d\n" ${#max} $i
done

Examples:

max=10

01
02
03
04
05
06
07
08
09
10

max=100

001
002
003
004
005
006
...
097
098
099
100

max=1000

0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000



چگونه در bash یک لیست بسازیم و روی اعضای آن عملیات انجام دهیم

برای انجام کاری لازم بود لیستی از سرورها ساخته شوند و سپس به صورت مرتب فایلها روی سرورها ارسال گردند.


برای اینکار از مفهوم زیر ایده گرفتم که اصل آنرا در اینجا میاورم


حالت اول، در این وضعیت هر خط در لیست به عنوان یک عضو در نظر گرفته می شود

اصطلاحا به آن with whitesapce گفته میشود.


listOfNames="RA
RB
R C
RD"

# To allow for other whitespace in the string:
# 1. add double quotes around the list variable, or
# 2. see the IFS note (under 'Side Notes')

for databaseName in "$listOfNames"   #  <-- Note: Added "" quotes.
do
  echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
done

# Outputs
# RA
# RB
# R C
# RD


without whitespace در اینحالت مشاهده میکنید که خط سوم لیست به صورت دو عضو سوا در نظر گرفته شده است.


listOfNames="RA
RB
R C
RD"

for databaseName in $listOfNames  # Note: No quotes
do
  echo "$databaseName"  # (i.e. do action / processing of $databaseName here...)
done

# Outputs
# RA
# RB
# R
# C
# RD