A. 一個linux shell腳本的疑問,請大蝦們指點,不甚感激!
[]與test是用於判定【表達式】的真假,而非可執行的shell命令。在這里,mv作為一個shell的命令會返回標志位,如果成功為如果成功則返回真(0),反之則返回假(非0),所以可以用if來判定是否執行成功。
!在這里是表示取反,意思是如果執行成功(!0=非0),就跳過,否則執行if與fi內的語句。因為有exit,所以一旦執行有問題則可以不再執行後續的腳本。
不僅是mv,其他的shell可執行命令都可以用if來判定執行結果,比如:
#使用!與chown
if ! chown root ./testfile ; then
echo $?
echo "can not change owner to root"
fi
#沒有使用!與chmod
if chmod 777 ./testfile ; then
echo $?
echo "chmod success"
fi
B. mv的分鏡頭腳本格式
要看你個人喜好。。大部分是用A4紙 畫4個(或者3個)方框用來畫腳本圖。。下面再是對白一類的文字
C. redhat系統的計劃任務執行腳本:shell腳本手動能成功,看日誌任務有執行,問題是只執行了一條mv語句
環境不一樣
手動的時候你是登錄了,載入了用戶的環境變數
計劃任務是不會去載入環境變數的
腳本最前面source一下環境變數試試看
. /etc/profile
. /etc/bashrc
自己看著加
D. 如何書寫shell腳本
如何編寫一個shell腳本
本文結合大量實例闡述如何編寫一個shell腳本。
為什麼要進行shell編程
在Linux系統中,雖然有各種各樣的圖形化介面工具,但是sell仍然是一個非常靈活的工具。Shell不僅僅是命令的收集,而且是一門非常棒的編程語言。您可以通過使用shell使大量的任務自動化,shell特別擅長系統管理任務,尤其適合那些易用性、可維護性和便攜性比效率更重要的任務。
下面,讓我們一起來看看shell是如何工作的:
建立一個腳本
Linux中有好多中不同的shell,但是通常我們使用bash (bourne again shell) 進行shell編程,因為bash是免費的並且很容易使用。所以在本文中筆者所提供的腳本都是使用bash(但是在大多數情況下,這些腳本同樣可以在bash的大姐,bourne shell中運行)。
如同其他語言一樣,通過我們使用任意一種文字編輯器,比如nedit、kedit、emacs、vi
等來編寫我們的shell程序。
程序必須以下面的行開始(必須方在文件的第一行):
#!/bin/sh
符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。
當編輯好腳本時,如果要執行該腳本,還必須使其可執行。
要使腳本可執行:
chmod +x filename
然後,您可以通過輸入: ./filename 來執行您的腳本。
注釋
在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結束。我們真誠地建議您在程序中使用注釋。如果您使用了注釋,那麼即使相當長的時間內沒有使用該腳本,您也能在很短的時間內明白該腳本的作用及工作原理。
變數
在其他編程語言中您必須使用變數。在shell編程中,所有的變數都由字元串組成,並且您不需要對變數進行聲明。要賦值給一個變數,您可以這樣寫:
變數名=值
取出變數值可以加一個美元符號($)在變數前面:
#!/bin/sh
#對變數賦值:
a="hello world"
# 現在列印變數a的內容:
echo "A is:"
echo $a
在您的編輯器中輸入以上內容,然後將其保存為一個文件first。之後執行chmod +x first
使其可執行,最後輸入./first執行該腳本。
這個腳本將會輸出:
A is:
hello world
有時候變數名很容易與其他文字混淆,比如:
num=2
echo "this is the $numnd"
這並不會列印出"this is the 2nd",而僅僅列印"this is the ",因為shell會去搜索變數numnd的值,但是這個變數時沒有值的。可以使用花括弧來告訴shell我們要列印的是num變數:
num=2
echo "this is the ${num}nd"
這將列印: this is the 2nd
有許多變數是系統自動設定的,這將在後面使用這些變數時進行討論。
如果您需要處理數學表達式,那麼您需要使用諸如expr等程序(見下面)。
除了一般的僅在程序內有效的shell變數以外,還有環境變數。由export關鍵字處理過的變數叫做環境變數。我們不對環境變數進行討論,因為通常情況下僅僅在登錄腳本中使用環境變數。
Shell命令和流程式控制制
在shell腳本中可以使用三類命令:
1)Unix 命令:
雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。
常用命令語法及功能
echo "some text": 將文字內容列印在屏幕上
ls: 文件列表
wc –l filewc -w filewc -c file: 計算文件行數計算文件中的單詞數計算文件中的字元數
cp sourcefile destfile: 文件拷貝
mv oldname newname : 重命名文件或移動文件
rm file: 刪除文件
grep 'pattern' file: 在文件內搜索字元串比如:grep 'searchstring' file.txt
cut -b colnum file: 指定欲顯示的文件內容範圍,並將它們輸出到標准輸出設備比如:輸出每行第5個到第9個字元cut -b5-9 file.txt千萬不要和cat命令混淆,這是兩個完全不同的命令
cat file.txt: 輸出文件內容到標准輸出設備(屏幕)上
file somefile: 得到文件類型
read var: 提示用戶輸入,並將輸入賦值給變數
sort file.txt: 對file.txt文件中的行進行排序
uniq: 刪除文本文件中出現的行列比如: sort file.txt | uniq
expr: 進行數學運算Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比如:根據文件名搜索find . -name filename -print
tee: 將數據輸出到標准輸出設備(屏幕) 和文件比如:somecommand | tee outfile
basename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tux
dirname file: 返迴文件所在路徑比如:dirname /bin/tux將返回 /bin
head file: 列印文本文件開頭幾行
tail file : 列印文本文件末尾幾行
sed: Sed是一個基本的查找替換程序。可以從標准輸入(比如命令管道)讀入文本,並將結果輸出到標准輸出(屏幕)。該命令採用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus 替換為 LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
awk: awk 用來從文本文件中提取欄位。預設地,欄位分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, '{print $1 "," $3 }'這里我們使用,作為欄位分割符,同時列印第一個和第三個欄位。如果該文件內容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令輸出結果為:Adam Bor, IndiaKerry Miller, USA
2) 概念: 管道, 重定向和 backtick
這些不是系統命令,但是他們真的很重要。
管道 (|) 將一個命令的輸出作為另外一個命令的輸入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有」hello」的行並計算其行數。
在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。
重定向:將命令的結果輸出到文件,而不是標准輸出(屏幕)。
> 寫入文件並覆蓋舊文件
>> 加到文件的尾部,保留舊文件內容。
反短斜線
使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數。
命令:
find . -mtime -1 -type f -print
用來查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
3) 流程式控制制
"if" 表達式 如果條件為真則執行then後面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字元串、判斷文件是否存在及是否可讀等等…
通常用" [ ] "來表示條件測試。注意這里的空格很重要。要確保方括弧的空格。
[ -f "somefile" ] :判斷是否是一個文件
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權
[ -n "$var" ] :判斷$var變數是否有值
[ "$a" = "$b" ] :判斷$a和$b是否相等
執行man test可以查看所有測試表達式可以比較和判斷的類型。
直接執行以下腳本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
變數$SHELL包含了登錄shell的名稱,我們和/bin/bash進行了比較。
快捷操作符
熟悉C語言的朋友可能會很喜歡下面的表達式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
這里 && 就是一個快捷操作符,如果左邊的表達式為真則執行右邊的語句。您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow文件存在則列印」 This computer uses shadow passwors」。同樣或操作(||)在shell編程中也是可用的。這里有個例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
該腳本首先判斷mailfolder是否可讀。如果可讀則列印該文件中的"From" 一行。如果不可讀則或操作生效,列印錯誤信息後腳本退出。這里有個問題,那就是我們必須有兩個命令:
-列印錯誤信息
-退出程序
我們使用花括弧以匿名函數的形式將兩個命令放到一起作為一個命令使用。一般函數將在下文提及。
不用與和或操作符,我們也可以用if表達式作任何事情,但是使用與或操作符會更便利很多。
case表達式可以用來匹配一個給定的字元串,而不是數字。
case ... in
...) do something here ;;
esac
讓我們看一個例子。 file命令可以辨別出一個給定文件的文件類型,比如:
file lf.gz
這將返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我們利用這一點寫了一個叫做smartzip的腳本,該腳本可以自動解壓bzip2, gzip 和zip 類型的壓縮文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) error "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到我們在這里使用了一個特殊的變數$1。該變數包含了傳遞給該程序的第一個參數值。也就是說,當我們運行:
smartzip articles.zip
$1 就是字元串 articles.zip
select 表達式是一種bash的擴展應用,尤其擅長於互動式使用。用戶可以從一組不同的值中進行選擇。
select var in ... ; do
break
done
.... now $var can be used ....
下面是一個例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是該腳本運行的結果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
您也可以在shell中使用如下的loop表達式:
while ...; do
....
done
while-loop 將運行直到表達式測試為真。will run while the expression that we test for is true. 關鍵字"break" 用來跳出循環。而關鍵字」continue」用來不執行餘下的部分而直接跳到下一個循環。
for-loop表達式查看一個字元串列表 (字元串用空格分隔) 然後將其賦給一個變數:
for var in ....; do
....
done
在下面的例子中,將分別列印ABC到屏幕上:
#!/bin/sh
for var in A B C ; do
echo "var is $var"
done
下面是一個更為有用的腳本showrpm,其功能是列印一些RPM包的統計信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
if [ -r "$rpmpackage" ];then
echo "=============== $rpmpackage =============="
rpm -qi -p $rpmpackage
else
echo "ERROR: cannot read file $rpmpackage"
fi
done
這里出現了第二個特殊的變數$*,該變數包含了所有輸入的命令行參數值。如果您運行showrpm openssh.rpm w3m.rpm webgrep.rpm
此時 $* 包含了 3 個字元串,即openssh.rpm, w3m.rpm and webgrep.rpm.
引號
在向程序傳遞任何參數之前,程序會擴展通配符和變數。這里所謂擴展的意思是程序會把通配符(比如*)替換成合適的文件名,它變數替換成變數值。為了防止程序作這種替換,您可以使用引號:讓我們來看一個例子,假設在當前目錄下有一些文件,兩個jpg文件, mail.jpg 和tux.jpg。
#!/bin/sh
echo *.jpg
這將列印出"mail.jpg tux.jpg"的結果。
引號 (單引號和雙引號) 將防止這種通配符擴展:
#!/bin/sh
echo "*.jpg"
echo '*.jpg'
這將列印"*.jpg" 兩次。
單引號更嚴格一些。它可以防止任何變數擴展。雙引號可以防止通配符擴展但允許變數擴展。
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo '$SHELL'
運行結果為:
/bin/bash
/bin/bash
$SHELL
最後,還有一種防止這種擴展的方法,那就是使用轉義字元——反斜桿:
echo *.jpg
echo $SHELL
這將輸出:
*.jpg
$SHELL
Here documents
當要將幾行文字傳遞給一個命令時,here documents(譯者註:目前還沒有見到過對該詞適合的翻譯)一種不錯的方法。對每個腳本寫一段幫助性的文字是很有用的,此時如果我們四有那個here documents就不必用echo函數一行行輸出。 一個 "Here document" 以 << 開頭,後面接上一個字元串,這個字元串還必須出現在here document的末尾。下面是一個例子,在該例子中,我們對多個文件進行重命名,並且使用here documents列印幫助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat <<HELP
ren -- renames a number of files using sed regular expressions
USAGE: ren 'regexp' 'replacement' files...
EXAMPLE: rename all *.HTM files in *.html:
ren 'HTM$' 'html' *.HTM
HELP
exit 0
fi
OLD="$1"
NEW="$2"
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
if [ -f "$file" ] ; then
newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
if [ -f "$newfile" ]; then
echo "ERROR: $newfile exists already"
else
echo "renaming $file to $newfile ..."
mv "$file" "$newfile"
fi
fi
done
這是一個復雜一些的例子。讓我們詳細討論一下。第一個if表達式判斷輸入命令行參數是否小於3個 (特殊變數$# 表示包含參數的個數) 。如果輸入參數小於3個,則將幫助文字傳遞給cat命令,然後由cat命令將其列印在屏幕上。列印幫助文字後程序退出。 如果輸入參數等於或大於3個,我們就將第一個參數賦值給變數OLD,第二個參數賦值給變數NEW。下一步,我們使用shift命令將第一個和第二個參數從參數列表中刪除,這樣原來的第三個參數就成為參數列表$*的第一個參數。然後我們開始循環,命令行參數列表被一個接一個地被賦值給變數$file。接著我們判斷該文件是否存在,如果存在則通過sed命令搜索和替換來產生新的文件名。然後將反短斜線內命令結果賦值給newfile。這樣我們就達到了我們的目的:得到了舊文件名和新文件名。然後使用mv命令進行重命名。
函數
如果您寫了一些稍微復雜一些的程序,您就會發現在程序中可能在幾個地方使用了相同的代碼,並且您也會發現,如果我們使用了函數,會方便很多。一個函數是這個樣子的:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
您需要在每個程序的開始對函數進行聲明。
下面是一個叫做xtitlebar的腳本,使用這個腳本您可以改變終端窗口的名稱。這里使用了一個叫做help的函數。正如您可以看到的那樣,這個定義的函數被使用了兩次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat <<HELP
xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
USAGE: xtitlebar [-h] "string_for_titelbar"
OPTIONS: -h help text
EXAMPLE: xtitlebar "cvs"
HELP
exit 0
}
# in case of error or if -h is given we call the function help:
[ -z "$1" ] && help
[ "$1" = "-h" ] && help
# send the escape sequence to change the xterm titelbar:
echo -e "33]0;$107"
#
在腳本中提供幫助是一種很好的編程習慣,這樣方便其他用戶(和您)使用和理解腳本。
命令行參數
我們已經見過$* 和 $1, $2 ... $9 等特殊變數,這些特殊變數包含了用戶從命令行輸入的參數。迄今為止,我們僅僅了解了一些簡單的命令行語法(比如一些強制性的參數和查看幫助的-h選項)。但是在編寫更復雜的程序時,您可能會發現您需要更多的自定義的選項。通常的慣例是在所有可選的參數之前加一個減號,後面再加上參數值 (比如文件名)。
有好多方法可以實現對輸入參數的分析,但是下面的使用case表達式的例子無遺是一個不錯的方法。
#!/bin/sh
help()
{
cat <<HELP
This is a generic command line parser demo.
USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
HELP
exit 0
}
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
-f) opt_f=1;shift 1;; # variable opt_f is set
-l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
您可以這樣運行該腳本:
cmdparser -l hello -f -- -somefile1 somefile2
返回的結果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
這個腳本是如何工作的呢?腳本首先在所有輸入命令行參數中進行循環,將輸入參數與case表達式進行比較,如果匹配則設置一個變數並且移除該參數。根據unix系統的慣例,首先輸入的應該是包含減號的參數。
實例
一般編程步驟
現在我們來討論編寫一個腳本的一般步驟。任何優秀的腳本都應該具有幫助和輸入參數。並且寫一個偽腳本(framework.sh),該腳本包含了大多數腳本都需要的框架結構,是一個非常不錯的主意。這時候,在寫一個新的腳本時我們只需要執行一下命令:
cp framework.sh myscript
然後再插入自己的函數。
讓我們再看兩個例子:
二進制到十進制的轉換
腳本 b2d 將二進制數 (比如 1101) 轉換為相應的十進制數。這也是一個用expr命令進行數學運算的例子:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat <<HELP
b2h -- convert binary to decimal
USAGE: b2h [-h] binarynum
OPTIONS: -h help text
EXAMPLE: b2h 111010
will return 58
HELP
exit 0
}
error()
{
# print an error and exit
echo "$1"
exit 1
}
lastchar()
{
# return the last character of a string in $rval
if [ -z "$1" ]; then
# empty string
rval=""
return
fi
# wc puts some space behind the output this is why we need sed:
numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
# now cut out the last char
rval=`echo -n "$1" | cut -b $numofchar`
}
chop()
{
# remove the last character in string and return it in $rval
if [ -z "$1" ]; then
# empty string
rval=""
return
fi
# wc puts some space behind the output this is why we need sed:
numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
if [ "$numofchar" = "1" ]; then
# only one char in string
rval=""
return
fi
numofcharminus1=`expr $numofchar "-" 1`
# now cut all but the last char:
rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
}
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
--) shift;break;; # end of options
-*) error "error: no such option $1. -h for help";;
*) break;;
esac
done
# The main program
sum=0
weight=1
# one arg must be given:
[ -z "$1" ] && help
binnum="$1"
binnumorig="$1"
while [ -n "$binnum" ]; do
lastchar "$binnum"
if [ "$rval" = "1" ]; then
sum=`expr "$weight" "+" "$sum"`
fi
# remove the last position in $binnum
chop "$binnum"
binnum="$rval"
weight=`expr "$weight" "*" 2`
done
echo "binary $binnumorig is decimal $sum"
#
該腳本使用的演算法是利用十進制和二進制數權值 (1,2,4,8,16,..),比如二進制"10"可以這樣轉換成十進制:
0 * 1 + 1 * 2 = 2
為了得到單個的二進制數我們是用了lastchar 函數。該函數使用wc –c計算字元個數,然後使用cut命令取出末尾一個字元。Chop函數的功能則是移除最後一個字元。
文件循環程序
或許您是想將所有發出的郵件保存到一個文件中的人們中的一員,但是在過了幾個月以後,這個文件可能會變得很大以至於使對該文件的訪問速度變慢。下面的腳本rotatefile 可以解決這個問題。這個腳本可以重命名郵件保存文件(假設為outmail)為outmail.1,而對於outmail.1就變成了outmail.2 等等等等...
#!/bin/sh
# vim: set sw=4 ts=4 et:
ver="0.1"
help()
{
cat <<HELP
rotatefile -- rotate the file name
USAGE: rotatefile [-h] filename
OPTIONS: -h help text
EXAMPLE: rotatefile out
This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
and create an empty out-file
The max number is 10
version $ver
HELP
exit 0
}
error()
{
echo "$1"
exit 1
}
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;;
--) break;;
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
# input check:
if [ -z "$1" ] ; then
error "ERROR: you must specify a file, use -h for help"
fi
filen="$1"
# rename any .1 , .2 etc file:
for n in 9 8 7 6 5 4 3 2 1; do
if [ -f "$filen.$n" ]; then
p=`expr $n + 1`
echo "mv $filen.$n $filen.$p"
mv $filen.$n $filen.$p
fi
done
# rename the original file:
if [ -f "$filen" ]; then
echo "mv $filen $filen.1"
mv $filen $filen.1
fi
echo touch $filen
touch $filen
這個腳本是如何工作的呢?在檢測用戶提供了一個文件名以後,我們進行一個9到1的循環。文件9被命名為10,文件8重命名為9等等。循環完成之後,我們將原始文件命名為文件1同時建立一個與原始文件同名的空文件。
調試
最簡單的調試命令當然是使用echo命令。您可以使用echo在任何懷疑出錯的地方列印任何變數值。這也是絕大多數的shell程序員要花費80%的時間來調試程序的原因。Shell程序的好處在於不需要重新編譯,插入一個echo命令也不需要多少時間。
shell也有一個真實的調試模式。如果在腳本"strangescript" 中有錯誤,您可以這樣來進行調試:
sh -x strangescript
這將執行該腳本並顯示所有變數的值。
shell還有一個不需要執行腳本只是檢查語法的模式。可以這樣使用:
sh -n your_script
這將返回所有語法錯誤。
E. linux下mv 多個文件到各自文件夾,如何操作
你這個問題主要是mv的用法了,我簡單說一下:
1. mv可以把多個文件移動到一個文件夾(目錄)裡面,比如:有a b c三個文件,一個目錄d,用下面命令就能將a b c移動到d中
$ mv a b c d
需要注意的是,目錄d必須在最後面,而且它前面不能再出現其他目錄
2. 也可以使用帶選項的mv命令,把多個文件移動到一個目錄中,如
$ mv a b c -t d
$ mv -t d a b c
其中,-t後面緊接著的就是要移動到的目錄,並且不能有多個目錄出現
3. 如果出現了多個目錄,比如下面的命令
$ mv -t adir a -t bdir b
mv: multiple target directories specified
會出現上面的警告,且只執行了前面正確的那部分,即只是將a移動到了adir,後面的沒執行
4。如果你的文件和目錄名稱有一定的關系,你的問題可以通過腳本來解決,當然,腳本的具體內容也要視具體情況而定
假設有文件a b c,希望將a移動到adir,將b移動到bdir,將c移動到cdir,那麼就可以這樣來做
寫一個簡單shell腳本:move.sh
# FileName move.sh
#!/bin/bash
mv $1 "$1dir"
$ chmod +x move.sh
然後,
$ find . -type f | xargs -n 1 ./move.sh
執行完畢之後,就發現
$ tree
.
|-- adir
| `-- a
|-- bdir
| `-- b
即實現了將a移動到adir,b移動到bdir,c移動到cdir了。
所以,總得來說,你的具體問題還要具體分析才好。當然,如果你的情況正是我上面說的,那麼,就用這種方法就OK了
希望對你有所幫助:)
F. linux 如何用mv命令批量更改文件名
單純的依靠mv命令做不到,需要腳本來實現
編寫腳本 rename 如下
#----------------------------------------------
#!/bin/sh
ls -l $1 | grep ^[^d] | awk '{print $9}'| while read line; do
do=`echo $line | grep $2`
if [ ! "$do" = "" ]; then
newname=`echo $line | sed 's/'$2'/'$3'/g'`
echo "rename $line to $newname ..."
mv $1/$line $1/$newname
fi
done
#------------------------------------------------
將以上保存為 rename文件,
然後運行
chmod +x rename
使rename可運行
然後按照如下格式執行rename
假設rename在當前路徑
$./rename [fullpathtofiles] .sql.cluster1 .sql
[fullpathtofiles] 指向你的BAOAN102671.sql.cluster1 這些文件的全路徑即可
參考以下我的演示 ,將具體路徑替換到你的即可,實際測試通過
--------------------------------
root@bogon~/testmv# ls
12343234234.sql.cluster1 323423423423.sql.cluster1 sdfdssddd.sql.cluster1
root@bogon~/testmv# cd ..
root@bogon~# ./rename ./testmv/ .sql.cluster1 .sql
rename 12343234234.sql.cluster1 to 12343234234.sql ...
rename 323423423423.sql.cluster1 to 323423423423.sql ...
rename sdfdssddd.sql.cluster1 to sdfdssddd.sql ...
root@bogon~# cd testmv
root@bogon~/testmv# ls
12343234234.sql 323423423423.sql sdfdssddd.sql
-----------------------------------------------------
G. git mv命令如何使用
git 命令 (gnu interactive tools)
功能說明:文字模式下的文件管理員。
語 法:git 命令
補充說明:git命令是用來管理文件的程序,它十分類似DOS下的Norton Commander,具有互動式操作界面。它的操作方法和Norton Commander幾乎一樣,略訴如下:
F1 :執行info指令,查詢指令相關信息,會要求您輸入欲查詢的名稱。
F2 :執行cat指令,列出文件內容。
F3 :執行gitview指令,觀看文件內容。
F4 :執行vi指令,編輯文件內容。
F5 :執行cp指令,復制文件或目錄,會要求您輸入目標文件或目錄。
F6 :執行mv指令,移動文件或目錄,或是更改其名稱,會要求您輸入目標文件或目錄。
F7 :執行mkdir指令,建立目錄。
F8 :執行rm指令,刪除文件或目錄。
F9 :執行make指令,批處理執行指令或編譯程序時,會要求您輸入相關命令。
F10 :離開git文件管理員。
----------------- Git命令具體使用-------------------------------
Git是一個分布式的版本控制工具,本篇文章從介紹Git開始,重點在於介紹Git的基本命令和使用技巧,讓你嘗試使用Git的同時,體驗到原來一個版本控制工具可以對開發產生如此之多的影響,文章分為兩部分:
第一部分,介紹Git的一些常用命令,其中穿插介紹Git的基本概念和原理
第二部分,重點介紹Git的使用技巧,最後會在Git Hub上創建一個開源項目開啟你的Git實戰之旅
Git是什麼
Git 在Wikipedia上的定義:它是一個免費的、分布式的版本控制工具,或是一個強調了速度快的源代碼管理工具。
Git 最初被Linus Torvalds開發出來用於管理Linux內核的開發。每一個Git的工作目錄都是一個完全獨立的代碼庫,並擁有完整的歷史記錄和版本追蹤能力,不依賴於網路和中心伺服器。
Git 的出現減輕了許多開發者和開源項目對於管理分支代碼的壓力,由於對分支的良好控制,更鼓勵開發者對自己感興趣的項目做出貢獻。其實許多開源項目包括 Linux kernel、Samba、X.org Server、Ruby on Rails,都已經過渡到使用Git作為自己的版本控制工具。對於我們這些喜歡寫代碼的開發者嘛,有兩點最大的好處,我們可以在任何地點(在上班的地鐵 上)提交自己的代碼和查看代碼版本;我們可以開許許多多個分支來實踐我們的想法,而合並這些分支的開銷幾乎可以忽略不計。
Git 1+1
現在進入本篇文章真正的主題,介紹一下Git的基本命令和操作,會從Git的版本庫的初始化,基本操作和獨有的常用命令三部分著手,讓大家能夠開始使用Git。
Git 通常有兩種方式來進行初始化:
git clone: 這是較為簡單的一種初始化方式,當你已經有一個遠程的Git版本庫,只需要在本地克隆一份
例如:git clone git://github.com/someone/some_project.git some_project
上面的命令就是將'git://github.com/someone/some_project.git'這個URL地址的遠程版本庫完全克隆到本地some_project目錄下面
git init和git remote:這種方式稍微復雜一些,當你本地創建了一個工作目錄,你可以進入這個目錄,使用'git init'命令進行初始化,Git以後就會對該目錄下的文件進行版本控制,這時候如果你需要將它放到遠程伺服器上,可以在遠程伺服器上創建一個目錄,並把 可訪問的URL記錄下來,此時你就可以利用'git remote add'命令來增加一個遠程伺服器端,
例如:git remote add origin git://github.com/someone/another_project.git
上面的命令就會增加URL地址為'git: //github.com/someone/another_project.git',名稱為origin的遠程伺服器,以後提交代碼的時候只需要使用 origin別名即可
Git 的基本命令
現在我們有了本地和遠程的版本庫,讓我們來試著用用Git的基本命令:
git pull:從其他的版本庫(既可以是遠程的也可以是本地的)將代碼更新到本地,例如:'git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝,該功能類似於SVN的update
git add:是 將當前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執行的一步,例如'git add app/model/user.rb'就會增加app/model/user.rb文件到Git的索引中,該功能類似於SVN的add
git rm:從當前的工作空間中和索引中刪除文件,例如'git rm app/model/user.rb',該功能類似於SVN的rm、del
git commit:提交當前工作空間的修改內容,類似於SVN的commit命令,例如'git commit -m story #3, add user model',提交的時候必須用-m來輸入一條提交信息,該功能類似於SVN的commit
git push:將本地commit的代碼更新到遠程版本庫中,例如'git push origin'就會將本地的代碼更新到名為orgin的遠程版本庫中
git log:查看歷史日誌,該功能類似於SVN的log
git revert:還原一個版本的修改,必須提供一個具體的Git版本號,例如'git revert ',Git的版本號都是生成的一個哈希值
上面的命令幾乎都是每個版本控制工具所公有的,下面就開始嘗試一下Git獨有的一些命令:
git branch:對分支的增、刪、查等操作,例如'git branch new_branch'會從當前的工作版本創建一個叫做new_branch的新分支,'git branch -D new_branch'就會強制刪除叫做new_branch的分支,'git branch'就會列出本地所有的分支
git checkout:Git的checkout有兩個作用,其一是在不同的branch之間進行切換,例如'git checkout new_branch'就會切換到new_branch的分支上去;另一個功能是還原代碼的作用,例如'git checkout app/model/user.rb'就會將user.rb文件從上一個已提交的版本中更新回來,未提交的內容全部會回滾
git rebase:用下面兩幅圖解釋會比較清楚一些,rebase命令執行後,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能
git reset:將當前的工作目錄完全回滾到指定的版本號,假設如下圖,我們有A-G五次提交的版本,其中C的版本號是 ,我們執行了'git reset '那麼結果就只剩下了A-C三個提交的版本
git stash:將當前未提交的工作存入Git工作棧中,時機成熟的時候再應用回來,這里暫時提一下這個命令的用法,後面在技巧篇會重點講解
git config:利用這個命令可以新增、更改Git的各種設置,例如'git config branch.master.remote origin'就將master的遠程版本庫設置為別名叫做origin版本庫,後面在技巧篇會利用這個命令個性化設置你的Git,為你打造獨一無二的 Git
git tag:可以將某個具體的版本打上一個標簽,這樣你就不需要記憶復雜的版本號哈希值了,例如你可以使用'git tag revert_version '來標記這個被你還原的版本,那麼以後你想查看該版本時,就可以使用 revert_version標簽名,而不是哈希值了
Git 之所以能夠提供方便的本地分支等特性,是與它的文件存儲機制有關的。Git存儲版本控制信息時使用它自己定義的一套文件系統存儲機制,在代碼根目錄下有一個.git文件夾,會有如下這樣的目錄結構:
有 幾個比較重要的文件和目錄需要解釋一下:HEAD文件存放根節點的信息,其實目錄結構就表示一個樹型結構,Git採用這種樹形結構來存儲版本信息,那麼 HEAD就表示根;refs目錄存儲了你在當前版本控制目錄下的各種不同引用(引用指的是你本地和遠程所用到的各個樹分支的信息),它有heads、 remotes、stash、tags四個子目錄,分別存儲對不同的根、遠程版本庫、Git棧和標簽的四種引用,你可以通過命令'git show-ref'更清晰地查看引用信息;logs目錄根據不同的引用存儲了日誌信息。因此,Git只需要代碼根目錄下的這一個.git目錄就可以記錄完 整的版本控制信息,而不是像SVN那樣根目錄和子目錄下都有.svn目錄。那麼下面就來看一下Git與SVN的區別吧
Git與SVN的不同
SVN(Subversion)是當前使用最多的版本控制工具。與它相比較,Git 最大的優勢在於兩點:易於本地增加分支和分布式的特性。
下面兩幅圖可以形象的展示Git與SVN的不同之處
------------
對 於易於本地增加分支,圖中Git本地和伺服器端結構都很靈活,所有版本都存儲在一個目錄中,你只需要進行分支的切換即可達到在某個分支工作的效果。而 SVN則完全不同,如果你需要在本地試驗一些自己的代碼,只能本地維護多個不同的拷貝,每個拷貝對應一個SVN伺服器地址。舉一個實際的例子,以前我所在 的小組使用SVN作為版本控制工具,當我正在試圖增強一個模塊,工作做到一半,由於會改變原模塊的行為導致代碼伺服器上許多測試的失敗,所以並沒有提交代 碼。這時候上級對我說,現在有一個很緊急的Bug需要處理, 必須在兩個小時內完成。我只好將本地的所有修改diff,並輸出成為一個patch文 件,然後回滾有關當前任務的所有代碼,再開始修改Bug的任務,等到修改好後,在將patch應用回來。前前後後要完成多個繁瑣的步驟,這還不計中間代碼 發生沖突所要進行的工作量。可是如果使用Git, 我們只需要開一個分支或者轉回到主分支上,就可以隨時開始Bug修改的任務,完成之後,只要切換到原來的分支就可以優雅的繼續以前的任務。只要你願意,每 一個新的任務都可以開一個分支,完成後,再將它合並到主分支上,輕松而優雅。
分布式對於Git而言,你可以本地提交代碼,所以在上面的圖 中,Git有利於將一個大任務分解,進行本地的多次提交,而SVN只能在本地進行大量的一次性更改,導致將來合並到主幹上造成巨大的風險。Git的代碼日 志是在本地的,可以隨時查看。SVN的日誌在伺服器上的,每次查看日誌需要先從伺服器上下載下來。我工作的小組,代碼伺服器在美國,每次查看小組幾年前所 做的工作時,日誌下載就需要十分鍾,這不能不說是一個痛苦。後來我們遷移到Git上,利用Git日誌在本地的特性,我用Ruby編寫了一個Rake腳本, 可以查看某個具體任務的所有代碼歷史,每次只需要幾秒鍾,大大方便我的工作。當然分布式並不是說用了Git就不需要一個代碼中心伺服器,如果你工作在一個 團隊里,還是需要一個伺服器來保存所有的代碼的。
總結
本篇介紹了Git的基本概念、一些常用命令和原理,大家可以嘗試動手體會一下,下一篇會重點介紹Git命令的使用技巧,Git附帶的工具,最後會在Git Hub上創建一個開源項目,敬請期待
H. mv命令 "目標不是目錄"提示
命令錯誤。多文件時最後一個文件名作為目標文件夾處理。應該寫一個shell腳本
F=$IFS
IFS=$'\n'
for i in $(dir -1)
do
mv "$i" "${i%.lrc}.txt"
done
IFS=$F
I. linux 常用命令要具體例子
命令很多的,一下子學了也會忘記的,只能慢慢積累,很多一般都用不上的1、文件查看和連接命令
將文件連接到一起,用「>」操作將幾個文件組合成一個新的文件,或者是用「>>」把文件追加到已存文件的後面。
語法:
cat[參數]filelist
-n或--number:由1開始對所有輸出的行數進行編號
-b或--number-nonblank:和n相似,但對空行不編號
-s:遇到兩行空白,替換為一行空白
-v:顯示不可列印的字元
filelist:用於結合文件的可選列表。2、分屏顯示命令
類似於cat,但它是每次顯示一頁,按空格顯示下一頁,按<q>鍵退出,按<h〉鍵給出幫助信息。該命令還有搜索字元的功能。
語法
more [選項] <file>...
-num:指定每屏顯示的行數
-d:在屏幕下面提示信息
-l:more默認遇到送紙符^L會暫停,使用該選項可以取消該功能
-f:計算實際行數
-p:不是以卷動的方式顯示每頁,而是先清屏再顯示
-s:遇到兩行空白,替換為一行空白
-u:不顯示下劃線
+/<string>:在文件中搜索字元串string,並顯示字元串所在頁的內容
+/<num>:從第num行開始顯示
file用於顯示的文件
3、按頁顯示文件。類似於more,但允許在文件中前後移動。
語法:
less[參數]文件名
-i:查詢時忽略大小寫。
-num:指定每頁顯示的行數
-p<string>:在文件中搜索字元串string,並從第一個符合條件的地方開始顯示
-S:當某列的內容超過顯示畫面的寬度時,直接將超出的部分截斷舍棄,默認情況下會把超出的部分折回來顯示復制、刪除和移動命令
1、拷貝文件。
語法:
cp[選項]<source><dest>
cp[選項]<source>....<directory>
-r遞歸拷貝目錄
-f刪除已存在的目標文件再復制
-a在備份中盡可能的保留源文件的結構和屬性。
2、刪除
rm [選項] <name>....
該命令用於逐個刪除指定的文件或目錄。默認清苦下,<name>為文件名,rm命令不刪除目錄,只有指定-d選項時候,才能刪除目錄
語法:
-f強制刪除,包括只讀文件,並且不給用戶任何提示
-i在刪除每個文件時提示用戶
-r遞歸刪除目錄下的內容移動或更名文件和目錄
語法:
mv [參數]源文件目標文件
-f強制復蓋已有文件。
-i在復蓋已有文件前提示用戶。
-u在目標文件的時間比原文件新時不復蓋目標文件。
-v在移動文件時輸出相關信息。創建和刪除目錄命令
1、創建目錄命令
mkdir[參數]目錄名
-p如果父目錄不存在,創建所有的父目錄。2、刪除空目錄。
語法:
rmdir[參數]目錄列表
-p 表示刪除指定目錄後,如果該目錄的父目錄為空,則將一並刪除切換工作目錄和顯示目錄命令
1、改變當前工作目錄。
語法:
cd 目錄名
如果後面不加目錄名,則返回用戶的根目錄,此外用戶必須擁有進入該目錄的許可權。另外cd ~ 指切換到自己的主目錄,cd ../.. 可以切換到單前目錄的上上目錄2、顯示正在工作或當前的目錄名。
pwd[參數]3、列出目錄中的內容。
語法:
ls[參數][目錄]
-A 顯示所有文件,包括隱藏文件(以「.」開頭的文件,但不列出當前目錄「.」和上級目錄「..」
-a 顯示所有文件,包括「.」和「..」目錄。
-d 只列出目錄名;不列出它的內容。
-l 給出文件的長列表。包括許可權、所有權、大小、文件名、最後修改時間等等。
-t 按時間順序顯示
-F 在列出的文件名後以符號表示文件類型,一般文件不加符號,可執行文件「*」,目錄加「/」
-R 若目錄下有文件,則遞歸地列出目錄下的文件查找與定位命令
1、查找文件或目錄命令
格式
find [path....] [expression]
該命令在目錄樹層次中從path開始向下查找文件,將符合expression要求的文件列出來。輸入命令中第一個以-、(、)、,、!開始的參數作為expression的部分,在這些符號之前的參數都被認為是要搜索的路徑,在這些符號之後的才被認為是expression的部分,如果不給出path,則使用當前工作的目錄,如果不給出expression,則使用-print作為預設expression
expression的參數有二三十個之多,這里只提幾個常用的
-amin<n> 在過去n分鍾內被訪問過的文件
-anewer<file> 比文件file更晚被訪問過的文件
-atime<n> 在過去n天被訪問過的文件
-cmin<n> 在過去n分鍾內修改過的文件
-cnewer<file> 比文件file更新的文件
-ctime<n> 在過去n天內修改過的文件
-empty 內容為空的文件
-gid<n>或-group<name> gid是n或是group名是name的文件
-ipath<p>,-path<p> 路徑名稱符合p的文件,ipath表示忽略大小寫
-name<name>,-iname<name> 文件名稱符合name的文件,iname表示忽略大小寫
-size<n單位> 文件大小是n個單位
-type<文件類型〉文件類型的含義與名利ls的選型一樣
-pid<n> 進程id是n的文件
exp1 exp2 或者exp1 -a exp2 或者exp1 -and exp2 含義相同,表示同時滿足這兩個條件
!expr或者-not expr 表示expr的否定
exp1 -o exp2 或者exp1 -or exp2 表示滿足其中一個條件就可以2、文件定位命令
locate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案。其方法是先建立一個包括系統內所有檔案名稱及路徑的資料庫,之後當尋找時就只需查詢這個資料庫,而不必實際深入檔案系統之中了。在一般的distribution 之中,資料庫的建立都被放在 contab 中自動執行。一般使用者在使用時只要用locate [選項] <search string>-u 建立資料庫,-u 會由根目錄開始
-U 建立資料庫,-U 則可以指定開始的位置。-e 將排除在尋找的范圍之外。-l 如果 是 1.則啟動安全模式。在安全模式下,使用者不會看到許可權無法看到的檔案。這會始速度減慢,因為 locate 必須至實際的檔案系統中取得檔案的許可權資料。-f 將特定的檔案系統排除在外,例如我們沒有到理要把 proc 檔案系統中的檔案放在資料庫中。-q 安靜模式,不會顯示任何錯誤訊息。-n 至多顯示 個輸出。-r 使用正規運算式 做尋找的條件。-o 指定資料庫存的名稱。-d 指定資料庫的路徑-h 顯示輔助訊息-v 顯示更多的訊息-V 顯示程式的版本訊息連接命令
ln [選項] <source> <dest>
Linux/Unix 檔案系統中,有所謂的連結(link),我們可以將其視為檔案的別名,而連結又可分為兩種 : 硬連結(hard link)與軟連結(symbolic link),硬連結的意思是一個檔案可以有多個名稱,而軟連結的方式則是產生一個特殊的檔案,該檔案的內容是指向另一個檔案的位置。硬連結是存在同一個檔案系統中,而軟連結卻可以跨越不同的檔案系統。 ln source dist 是產生一個連結(dist)到 source,至於使用硬連結或軟鏈結則由參數決定。 不論是硬連結或軟鏈結都不會將原本的檔案復制一份,只會佔用非常少量的磁碟空間。-f : 鏈結時先將與 dist 同檔名的檔案刪除
-d : 允許系統管理者硬鏈結自己的目錄
-i : 在刪除與 dist 同檔名的檔案時先進行詢問
-n : 在進行軟連結時,將 dist 視為一般的檔案
-s : 進行軟鏈結(symbolic link)
-v : 在連結之前顯示其檔名
-b : 將在鏈結時會被覆寫或刪除的檔案進行備份
改變文件或目錄的時間命令
touch [選項] <file1> [<file2>....]
-a 改變檔案的讀取時間記錄。
-m 改變檔案的修改時間記錄。
-c 假如目的檔案不存在,不會建立新的檔案。與 --no-create 的效果一樣。
-f 不使用,是為了與其他 unix 系統的相容性而保留。
-r 使用參考檔的時間記錄,與 --file 的效果一樣。
-d 設定時間與日期,可以使用各種不同的格式。
-t 設定檔案的時間記錄,格式與 date 指令相同。
--no-create 不會建立新檔案。
備份命令
tar <主選項> [輔選項] <文件或目錄>
tar可以為文件和目錄創建檔案。利用tar,用戶可以為某一特定文件創建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。tar最初被用來在磁帶上創建檔案,現在,用戶可以在任何設備上創建檔案,如軟盤。利用tar命令,可以把一大堆的文件和目錄全部打包成一個文件,這對於備份文件或將幾個文件組合成為一個文件以便於網路傳輸是非常有用的。Linux上的tar是GNU版本的。
主選項:
c 創建新的檔案文件。如果用戶想備份一個目錄或是一些文件,就要選擇這個選項。
r 把要存檔的文件追加到檔案文件的未尾。例如用戶已經作好備份文件,又發現還有一個目錄或是一些文件忘記備份了,這時可以使用該選項,將忘記的目錄或文件追加到備份文件中。
t 列出檔案文件的內容,查看已經備份了哪些文件。
u 更新文件。就是說,用新增的文件取代原備份文件,如果在備份文件中找不到要更新的文件,則把它追加到備份文件的最後。
x 從檔案文件中釋放文件。
輔選項:
b 該選項是為磁帶機設定的。其後跟一數字,用來說明區塊的大小,系統預設值為20(20*512 bytes)。
f 使用檔案文件或設備,這個選項通常是必選的。
k 保存已經存在的文件。例如我們把某個文件還原,在還原的過程中,遇到相同的文件,不會進行覆蓋。
m 在還原文件時,把所有文件的修改時間設定為現在。
M 創建多卷的檔案文件,以便在幾個磁碟中存放。
v 詳細報告tar處理的文件信息。如無此選項,tar不報告文件信息。
w 每一步都要求確認。
z 用gzip來壓縮/解壓縮文件,加上該選項後可以將檔案文件進行壓縮,但還原時也一定要使用該選項進行解壓縮。
tar的最基本的用法舉例
tar -cf all.tar *.jpg
這條命令是將所有.jpg的文件打成一個名為all.tar的包。-c是表示產生新的包,-f指定包的文件名。
tar -rf all.tar *.gif
這條命令是將所有.gif的文件增加到all.tar的包裡面去。-r是表示增加文件的意思。
tar -uf all.tar logo.gif
這條命令是更新原來tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
tar -tf all.tar
這條命令是列出all.tar包中所有文件,-t是列出文件的意思
tar -tvf all.tar |more
這條命令是列出all.tar包中所有文件,並以分屏方式壓縮和解壓命令
gzip命令是用來壓縮文件的。它不僅可以用來壓縮大的、較少使用的文件以節省磁碟空間,還可以和tar命令一起構成Linux操作系統中比較流行的壓縮文件格式。據統計,gzip命令對文本文件有60%~70%的壓縮率。
gzip [選項] [文件名]
-c 輸出並保留原文件
-d 將壓縮文件解壓,默認情況下為壓縮
-l 顯示壓縮文件的壓縮的提示信息
-r 遞歸的壓縮或解壓
-t,可以用來測試壓縮文件的完整性。如果文件正常,gzip不會給出任何顯示。如果想看到OK這兩個字母,可以在測試某個文件時使用-tv參數。
-v 對每個操作的文件,顯示文件名和壓縮比例
unzip 命令位於/usr/bin目錄中,它們和MS DOS下的pkzip、pkunzip及MS Windows中的Winzip軟體功能一樣,將文件壓縮成.zip文件,以節省硬碟空間,當需要的時候再將壓縮文件用unzip命令解開。該命令使用許可權是所有用戶。
unzip [選項] [壓縮文件名]
-d<目錄> 知道解壓的某個目錄下,默認為當前目錄
-n:解壓縮時不要覆蓋原有的文件。
-o:不必先詢問用戶,unzip執行後覆蓋原有文件
-j:不處理壓縮文件中原有的目錄路徑,把所有文件解壓到同一目錄
-v:察看壓縮文件的內容,但不解壓
-t:檢查壓縮文件是否正確,但不解壓顯示文字命令
echo [-n] <字元串〉
在屏幕上顯示字元串,-n表示不換行顯示日立命令
cal [選項] [[月]年]
- j 顯示出給定月中的每一天是一年中的第幾天(從1月1日算起)。
- y 顯示出整年的日歷。
-1 顯示當月的日歷
-3顯示前一月,本月,下月的日歷
-s以星期天作為一周的第一天
-m以星期一作為一周的第一天如cal 5 2006
顯示2006年5月份的日歷
日期時間命令
date [選項] [+FormatString] 顯示日期時間
date <setstring> 設置日期時間
它的選項比較多,一凡在此就不一一列出來了清屏命令clear軟體包管理
RPM全稱是 Red Hat Package Manager(Red Hat包管理器)。幾乎所有的 Linux 發行版本都使用這種形式的軟體包管理安裝、更新和卸載軟體。
01、安裝
rpm -i ( or --install) options file1.rpm ... fileN.rpm
-h (or --hash) 安裝時輸出hash記號 (``#'')
--test 只對安裝進行測試,並不實際安裝。
--percent 以百分比的形式輸出安裝的進度。
--excludedocs 不安裝軟體包中的文檔文件
--includedocs 安裝文檔
--replacepkgs 強制重新安裝已經安裝的軟體包
--replacefiles 替換屬於其它軟體包的文件
--force 忽略軟體包及文件的沖突
--noscripts 不運行預安裝和後安裝腳本
--prefix 將軟體包安裝到由 指定的路徑下
--ignorearch 不校驗軟體包的結構
--ignoreos 不檢查軟體包運行的操作系統
--nodeps 不檢查依賴性關系
--ftpproxy 用 作為 FTP代理
--ftpport 指定FTP的埠號為
通用選項
-v 顯示附加信息
-vv 顯示調試信息
--root 讓RPM將指定的路徑做為"根目錄",這樣預安裝程序和後安裝程序都會安裝到這個目錄下
--rcfile 設置rpmrc文件為
--dbpath 設置RPM 資料庫存所在的路徑為02、刪除
命令格式:
rpm -e ( or --erase) options pkg1 ... pkgN
參數
pkg1 ... pkgN :要刪除的軟體包
詳細選項
--test 只執行刪除的測試
--noscripts 不運行預安裝和後安裝腳本程序
--nodeps 不檢查依賴性
03、升級
命令格式
rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm
參數
file1.rpm ... fileN.rpm 軟體包的名字
詳細選項
-h (or --hash) 安裝時輸出hash記號 (``#'')
--oldpackage 允許"升級"到一個老版本
--test 只進行升級測試
--excludedocs 不安裝軟體包中的文檔文件
--includedocs 安裝文檔
--replacepkgs 強制重新安裝已經安裝的軟體包
--replacefiles 替換屬於其它軟體包的文件
--force 忽略軟體包及文件的沖突
--percent 以百分比的形式輸出安裝的進度。
--noscripts 不運行預安裝和後安裝腳本
--prefix 將軟體包安裝到由 指定的路徑下
--ignorearch 不校驗軟體包的結構
--ignoreos 不檢查軟體包運行的操作系統
--nodeps 不檢查依賴性關系
--ftpproxy 用 作為 FTP代理
--ftpport 指定FTP的埠號為04、查詢
命令格式:
rpm -q ( or --query) options
參數:
pkg1 ... pkgN :查詢已安裝的軟體包
詳細選項
-p (or ``-'') 查詢軟體包的文件
-f 查詢屬於哪個軟體包
-a 查詢所有安裝的軟體包
--whatprovides 查詢提供了 功能的軟體包
-g 查詢屬於 組的軟體包
--whatrequires 查詢所有需要 功能的軟體包
信息選項
示軟體包的全部標識
-i 顯示軟體包的概要信息
-l 顯示軟體包中的文件列表
-c 顯示配置文件列表
-d 顯示文檔文件列表
-s 顯示軟體包中文件列表並顯示每個文件的狀態
--scripts 顯示安裝、卸載、校驗腳本
--queryformat (or --qf) 以用戶指定的方式顯示查詢信息
--mp 顯示每個文件的所有已校驗信息
--provides 顯示軟體包提供的功能
--requires (or -R) 顯示軟體包所需的功能
05、校驗已安裝的軟體包
命令格式:
rpm -V ( or --verify, or -y) options
參數
pkg1 ... pkgN 將要校驗的軟體包名
軟體包選項
-p Verify against package file
-f 校驗所屬的軟體包
-a Verify 校驗所有的軟體包
-g 校驗所有屬於組 的軟體包
詳細選項
--noscripts 不運行校驗腳本
--nodeps 不校驗依賴性
--nofiles 不校驗文件屬性
06、校驗軟體包中的文件
語法:
rpm -K ( or --checksig) options file1.rpm ... fileN.rpm
參數:
file1.rpm ... fileN.rpm 軟體包的文件名連接幫助命令
man <command>
info <command> 該功能比man強大,但目前只在Linux中有,其他的UNIX中沒有該命令
help <command>
J. Linux 如何移動部分文件夾
mv file1 file2 file3 file4 file5 目標文件
mv [選項(option)] 源文件或目錄 目標文件或目錄
mv命令來為文件或目錄改名或將文件由一個目錄移入另一個目錄中。該命令等同於DOS系統下的ren和move命令的組合。它的使用許可權是所有用戶
[options]主要參數(幾個重要的參數)
-i:交互方式操作。如果mv操作將導致對已存在的目標文件的覆蓋,此時系統詢問是否重寫,要求用戶回答」y」或」n」,這樣可以避免誤覆蓋文件。
-f:禁止交互操作。mv操作要覆蓋某個已有的目標文件時不給任何指示,指定此參數後i參數將不再起作用。 - r 指示mv將參數中列出的全部目錄和子目錄均遞歸地移動。
第二個參數
當第二個參數類型是文件時,mv命令完成文件重命名,它將所給的源文件或目錄重命名為給定的目標文件名。
當第二個參數是已存在的目錄名稱時,源文件或目錄參數可以有多個,mv命令將各參數指定的源文件均移至目標目錄中。在跨文件系統移動文件時,mv先拷貝,再將原有文件刪除,而鏈至該文件的鏈接也將丟失。
例子:mv /usr/lib/* /zone是將 /usr/lib/下所有的東西移到/zone/中