可以復習一下xargs的用法,和變量的一些高級操作技巧
如何批量把若干文件從一個擴展名改為另一個擴展名?比如把后綴gz,改為zip
答:
1.for file in *.gz; do mv $file `basename $file .gz`.zip; done
或(也適合ksh)
for file in *.gz; do mv $file $.zip; done
2.ls | grep gz | awk -F'.' '{print }'|xargs -i mv {}.gz {}.zip
附netman十三問片斷:
$MILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:拿掉第一條 / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt
$:拿掉最后一條 / 及其左邊的字符串:my.file.txt
$:拿掉第一個 . 及其左邊的字符串:file.txt
$:拿掉最后一個 . 及其左邊的字符串:txt
$:拿掉最后條 / 及其右邊的字符串:/dir1/dir2/dir3
$:拿掉第一條 / 及其右邊的字符串:(空值)
$:拿掉最后一個 . 及其右邊的字符串:/dir1/dir2/dir3/my.file
$:拿掉第一個 . 及其右邊的字符串:/dir1/dir2/dir3/my
記憶的方法為:
# 是去掉左邊(在鑒盤上 # 在 $ 之左邊)
% 是去掉右邊(在鑒盤上 % 在 $ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。
$:提取最左邊的 5 個字節:/dir1
$:提取第 5 個字節右邊的連續 5 個字節:/dir2
我們也可以對變量值里的字符串作替換:
$:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
$:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt
利用 ${ } 還可針對不同的變量狀態賦值(沒設定、空值、非空值):
$ :假如 $file 沒有設定,則使用 my.file.txt 作默認值。(保留空值及非空值)
$ :假如 $file 沒有設定或為空值,則使用 my.file.txt 作默認值。 (保留非空值)
$ :不管 $file 為何值,均使用 my.file.txt 作默認值。 (不保留任何值)
$ :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (保留沒設定及空值)
$ :若 $file 沒設定,則使用 my.file.txt 作默認值,同時將 $file 定義為非空值。 (保留空值及非空值)
$ :若 $file 沒設定或為空值,則使用 my.file.txt 作默認值,同時將 $file 定義為非空值。 (保留非空值)
$ :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (保留空值及非空值))
$ :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (保留非空值)
還有哦,$ 可計算出變量值的長度:
$ 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個字節...
接下來,再為大家介稍一下 bash 的組數(array)處理方法。
一般而言,A="a b c def" 這樣的變量只是將 $A 替換為一個單一的字符串,
但是改為 A=(a b c def) ,則是將 $A 定義為組數...
bash 的組數替換方法可參考如下方法:
$ 或 $ 可得到 a b c def (全部組數)
$ 可得到 a (第一個組數),$ 則為第二個組數...
$ 或 $ 可得到 4 (全部組數數量)
$ 可得到 1 (即第一個組數(a)的長度),$ 可得到 3 (第四個組數(def)的長度)
A[3]=xyz 則是將第四個組數重新定義為 xyz ...