生成任意大小的文件
dd
if表示輸入文件(input file);
of表示輸出文件(output file);
bs指定了以字節爲單位的塊大小(block size);
count表示需要被複制的塊數。
$ dd if=/dev/zero of=junk.data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00767266 s, 137 MB/s
文本文件的交集與差集
comm命令可用於比較兩個已排序的文件
交集(intersection):打印出兩個文件所共有的行。
求差(difference):打印出指定文件中所包含的互不相同的那些行。
差集(set difference)1:打印出包含在文件A中,但不包含在其他指定文件(例如B和C)中的那些行。
$ sort A.txt -o A.txt ; sort B.txt -o B.txt
(1) 首先執行不帶任何選項的comm:
$ comm A.txt B.txt
(2) 爲了打印兩個文件的交集,我們需要刪除前兩列,只打印出第三列。-1選項可以刪除第 一列,-2選項可以刪除第二列,最後留下的就是第三列:
$ comm A.txt B.txt -1 -2
(3) 刪除第三列,就可以打印出兩個文件中互不相同的那些行:
$ comm A.txt B.txt -3
(4) 可以使用tr(在第2章中講到過)刪除製表符來合併兩列:
$ comm A.txt B.txt -3 | tr -d '\t'
(5) 通過刪除不需要的列,我們就可以分別得到A.txt和B.txt的差集。
A.txt的差集
$ comm A.txt B.txt -2 -3 -2 -3 刪除第二列和第三列。
B.txt的差集
$ comm A.txt B.txt -1 -3 -1 -3 刪除第一列和第三列。
comm的命令行選項可以減少輸出。
-1:刪除第一列。
-2:刪除第二列。
-3:刪除第三列。
查找並刪除重複文件
$ echo "hello" > test ; cp test test_copy1 ; cp test test_copy2; $ echo "next" > other;
# test_copy1和test_copy2都是test文件的副本
# !/bin/bash 11 # 文件名: remove_duplicates.sh
# 用途: 查找並刪除重複文件,每一個文件只保留一份
ls -lS --time-style=long-iso | awk 'BEGIN {
getline; getline;
name1=$8; size=$5
}
{
name2=$8;
if (size==$5)
{
"md5sum "name1 | getline; csum1=$1;
"md5sum "name2 | getline; csum2=$1;
if ( csum1==csum2 )
{
print name1; print name2
}
};
size=$5; name1=name2;
}' | sort -u > duplicate_files
cat duplicate_files | xargs -I {} md5sum {} | \ sort | uniq -w 32 | awk '{ print $2 }' | \
sort -u > unique_files
echo Removing..
comm duplicate_files unique_files -3 | tee /dev/stderr | \
xargs rm
echo Removed duplicates files successfully.
$ ./remove_duplicates.sh
文件權限、所有權與粘滯位
ls命令的-l選項可以顯示出包括文件類型、權限、所有者以及組在內的多方面信息:
-:普通文件。
d:目錄。
c:字符設備。
b:塊設備。
l:符號鏈接。
s:套接字。
p:管道。
chmod命令設置文件權限:
$ chmod u=rwx g=rw o=r filename
命令中用到的選項如下。
u:指定用戶權限。
g:指定用戶組權限。
o:指定其他用戶權限。
$ chmod o+x filename
該命令爲其他用戶添加了x權限。
給所有權限類別(即用戶、用戶組和其他用戶)添加可執行權限:
$ chmod a+x filename
其中,a表示全部(all)。
如果需要刪除權限,則使用-,例如:
$ chmod a-x filename
- 更改所有權
$ chown user:group filename
$ chown slynux:users test.sh
在這裏,slynux是用戶名,users是組名。
- 設置粘滯位
使用chmod的+t選項設置:
$ chmod a+t directory_name
- 以遞歸方式設置文件權限
$ chmod 777 . -R 選項-R指定以遞歸的方式修改權限。
用.指定當前工作目錄,這等同於: $ chmod 777 "$(pwd)" -R
- 以遞歸的方式設置所有權
用chown命令的-R能夠以遞歸的方式設置所有權:
$ chown user:group . -R
- 以不同的身份運行可執行文件(setuid)
$ chmod +s executable_file
# chown root:root executable_file # chmod +s executable_file
$ ./executable_file
將文件設置爲不可修改
chattr命令可用於更改擴展屬性。它能夠將文件設置爲不可修改,也可以修改其他屬性來
調節文件系統同步或壓縮率。
(1) 使用chatter將文件設置爲不可修改:
# chattr +i file
(2) 現在文件已經無法修改了。來試試下面的命令:
rm file
rm: cannot remove 'file': Operation not permitted
(3) 如果需要使文件恢復可寫狀態,撤銷不可修改屬性即可:
chattr -i file
批量生成空白文件
touch命令可以用來生成空白文件或是修改已有文件的時間戳。
(1) 調用touch命令並使用一個不存在的文件名作爲參數,創建空白文件:
$ touch filename
(2) 批量生成不同名字的空白文件:
for name in {1..100}.txt
do
touch $name
done
touch -a 只更改文件訪問時間。
touch -m 只更改文件修改時間。
除了將時間戳更改爲當前時間,我們還能夠指定特定的時間和日期:
$ touch -d "Fri Jun 25 20:50:14 IST 1999" filename
查找符號鏈接及其指向目標
(1) 創建符號鏈接:
$ ln -s target symbolic_link_name
例如:
$ ln -l -s /var/www/ ~/web 這個命令在當前用戶的主目錄中創建了一個名爲Web的符號鏈接。該鏈接指向/var/www。
(2) 使用下面的命令來驗證鏈接是否已建立:
$ ls -l web
lrwxrwxrwx 1 slynux slynux 8 2010-06-25 21:34 web -> /var/www
web -> /var/www表明web指向 /var/www。
(3) 打印出當前目錄下的符號鏈接:
$ ls -l | grep "^l"
(4) 打印出當前目錄及其子目錄下的符號鏈接:
$ find . -type l -print
(5) 使用readlink打印出符號鏈接所指向的目標路徑:
$ readlink web
/var/www
枚舉文件類型統計信息
(1) 用下面的命令打印文件類型信息:
$ file filename
$ file /etc/passwd
/etc/passwd: ASCII text
(2) 打印不包括文件名在內的文件類型信息:
$ file -b filename
ASCII text
(3) 生成文件統計信息的腳本如下:
# !/bin/bash
# 文件名: filestat.sh
if [ $# -ne 1 ]; then
echo "Usage is $0 basepath";
exit fi
path=$1
declare -A statarray;
while read line;
do
ftype=`file -b "$line" | cut -d, -f1` let statarray["$ftype"]++;
done < (find $path -type f -print)
echo ============ File types and counts =============
for ftype in "${!statarray[@]}";
do
echo $ftype : ${statarray["$ftype"]}
done
(4) 用法如下:
$ ./filestat.sh /home/slynux/temp
(5) 輸出信息如下:
$ ./filetype.sh /home/slynux/programs
============ File types and counts ============= Vim swap file : 1
ELF 32-bit LSB executable : 6
ASCII text : 2
ASCII C program text : 10