Linux Shell 用法(三)1.文件的相關操作

生成任意大小的文件

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
  1. 更改所有權
    $ chown user:group filename
$ chown slynux:users test.sh
在這裏,slynux是用戶名,users是組名。
  1. 設置粘滯位
使用chmod的+t選項設置: 
$ chmod a+t directory_name
  1. 以遞歸方式設置文件權限
$ chmod 777 . -R 選項-R指定以遞歸的方式修改權限。
用.指定當前工作目錄,這等同於: $ chmod 777 "$(pwd)" -R

  1. 以遞歸的方式設置所有權
用chown命令的-R能夠以遞歸的方式設置所有權:
$ chown user:group . -R

  1. 以不同的身份運行可執行文件(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
發佈了44 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章