بر روی یک سرور قبلا اجراهایی صورت گرفته و فایل های زیادی تولید شده که باعث پر شدن کل فضای هارد سرور و از کار افتادن آن شده است.
پس از برگزاری جلسات با گروه مربوطه تصمیم به پاک کردن فایل های txt که دیگر مورد نیاز نبودند گرفتیم.
هنگامی که از دستور rm -rf استفاده کردم با پیام خطای زیر مواجه شدم.
-bash: /usr/bin/rm: Argument list too long
البته فقط دستور ls اجرا میشد.
ابتدا با دسته بندی کردن نام فایل ها به ترتیب آنها را حذف می کردم، اما این کار بسیار وقت گیر بود.
با جستجو در اینترنت به روش زیر رسیدم که بسیار عالی و سریع بود.
با دستور زیر حذف را به بلاک های 200 فایلی محدود می کنیم.
echo *.txt|xargs -n 200 rm -fv
می توان عدد 200 را زیادتر یا کمتر کرد که در هر بار حذف، همان تعداد را حذف می کند.
روش اول -
$ 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:
01
02
03
04
05
06
07
08
09
10
001
002
003
004
005
006
...
097
098
099
100
0001
0002
0003
0004
0005
0006
...
0997
0998
0999
1000
برای انجام کاری لازم بود لیستی از سرورها ساخته شوند و سپس به صورت مرتب فایلها روی سرورها ارسال گردند.
برای اینکار از مفهوم زیر ایده گرفتم که اصل آنرا در اینجا میاورم
حالت اول، در این وضعیت هر خط در لیست به عنوان یک عضو در نظر گرفته می شود
اصطلاحا به آن 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
دستور زیر فایلها و فولدر ها را در لینوکس نمایش میدهد
for d in *; do
echo $d
done
به صورت زیر تنها فولدرها نمایش داده می شوند
for d in */ ; do
echo "$d"
done
نکته اساسی: می توان به جای دستور echo سایر دستورات را به کار برد