Nalezení a smazání starších souborů
Pokud potřebujete promazat adresář od starších souborů, např. jpg soubory starší více jak 100 dní, použijte příkaz:
find /cesta/k/adresari/ -mtime +100 -type f \( -name \*\.jpg \) | xargs rm
Pokud potřebujete promazat adresář od starších souborů, např. jpg soubory starší více jak 100 dní, použijte příkaz:
find /cesta/k/adresari/ -mtime +100 -type f \( -name \*\.jpg \) | xargs rm
Zajímavý script, pomocí kterého zamícháte náhodně řádky v souboru:
#!/bin/bash
# function to display usage message and exit
usage()
{
cat < < eof
$(basename $0) input_filename.txt
eof
exit 1
}
# if number args less than 1...
if [ $# -lt 1 ]; then
usage
fi
# if first arg isn't a file
if [ ! -f $1 ]; then
usage
fi
# open file
exec 3<$1
# declare an array and an integer
declare -a linearray
declare -i counter=0
# read file to linearray
while read line <&3; do
linearray[${counter}]=$line
((counter++))
done
#close file
exec 3>&-
for (( i=0; i < $counter; i++ )); do
switch=1
#get number not already used
while [ $switch -eq 1 ]; do
switch=0
number=$(($RANDOM % $counter))
for num in $linenolist; do
if [ $num -eq $number ]; then
switch=1
fi
done
done
linenolist="$linenolist $number"
echo ${linearray[$number]} >> testoutput.txt
done
echo "DONE"
Pokud chcete výpis všech IP přidělených na server použijte příkaz:
ifconfig | grep "inet addr" | awk '{print $2}' | awk -F: '{print $2}' | gawk -F' ' '{print $1}'
Řešil jsem problém jak na serveru globálně zakázat např. traffik z Číny.
Narazil jsem ovšem na problém kde vzít aktuální seznam všech IP adres které má Čína přidělené. Dosud jsem používal tento seznam. Ovšem nastal problém že tento seznam již nebyl dlouho aktualizován, proto jsem hledal jiné řešení a nalezl ho.
Na této adrese si mohu vygenerovat celé aktuální rozsahy IP adres pro jakýkoliv stát ve formátu např.:
58.14.0.0 58.25.255.255 58.30.0.0 58.63.255.255 58.66.0.0 58.67.255.255 58.68.128.0 58.68.255.255 .. atd.
Do Firewallu však potřebuji IP adresu ve zkráceném formátu např.: 58.14.0.0/15.
Vytvořil jsem si tedy script který převede hromadně všechny rozsahy IP adres na jejich zkrácený tvar.
mkdir -p /home/src/ wget http://jodies.de/ipcalc-archive/ipcalc-0.41.tar.gz cd /home/src/ipcalc-0.41 touch prevod ips chmod +x prevod
Do souboru prevod jsem vložil:
#!/bin/bash
clear
replace ' ' '-' -- ips > /dev/null
LINES=`cat ips`
for LINE in ${LINES[@]}; do
pos=`expr index "$LINE" '-'`
ip2="${LINE:pos-1}"
ip1=${LINE/$ip2/}
ip2=${ip2/\-/}
./ipcalc -r ${ip1} ${ip2} | grep '/'
done
Nyní jsem už jen vložil IP rozsahy vygenerované na této adrese do souboru ips a spustil script:
./prevod
Voilá.. dostal jsem seznam IP rozsahů ve zkrácené formě, které jsem následně vložil do firewallu:
/sbin/iptables -A INPUT -s 58.186.0.0/15 -j DROP
Pokud potřebujete změnit koncovku souborů např. z *.JPG na *.jpg hromadně, použijte příkaz (pro malý počet souborů v adresáři):
cd /cesta/do/adresáře rename .JPG .jpg *.JPG
(pro velký počet souborů v adresáři):
cd /cesta/do/adresáře
for i in $(ls|grep '\.JPG$'); do mv $i ${i%JPG}jpg; done
Důvod, proč při velkém množství souborů použít druhý příkaz je, že příkaz rename vám to z důvodu limitu (1024 characters) nedovolí přejmenovat.
Celkový počet souborů v adresáři /cesta/do/adresáře zobrazíte příkazem:
find /cesta/do/adresáře -type f | wc -l
Tento příklad nalezne a vypíše všechny soubory v adresáři /cesta/do/adresáře které obsahují slova „text“, „slovo“, „hodina“:
egrep -d recurse -n '(text|slovo|hodina)' /cesta/do/adresáře/
Tip: použitím např.: –exclude=“*.avi“ –exclude=“*.mpg“ vynechá soubory těchto koncovek.
Tento příklad změní vlastníka všech souborů v adresáři /cesta/do/adresáře, z „nobody“ na „apache“:
find /cesta/do/adresáře -user "nobody" -print0 | xargs -0 chown apache:apache
Účelné například pokud přesouváte soubory ze serveru kde běžel Apache1.3 na server kde běží Apache2.
Tento příklad prohledá všechny soubory v adresáři /cesta/do/adresáře, které jsou větší než 500Mb:
find /cesta/do/adresáře -type f -size +500000000c
Tento příklad prohledá všechny soubory v adresáři /cesta/do/adresáře a nahradí text v souborech z „hledaný text“ za „nový text“:
find /cesta/do/adresáře -type f -print0 | xargs -0 sed -i 's|hledaný text|nový text|g'
Stejný příklad… ale nahradí celou řádku, ne jen hledaný text:
find /cesta/do/adresáře -type f -print0 | xargs -0 sed -i 's|.*hledaný text.*|nový text|g'
Dalším (a jednodušším) způsobem jak nahradit hromadně text v souborech je použitím příkazu replace.
Je potřeba mít ale nainstalován balíček mysql-server jehož je příkaz replace součástí.
Syntaxe je:
replace 'hledaný text' 'nový text' -- /cesta/do/adresáře/*