2017-04-25 324 views
1

作業:我必須使用diff和sort以及使用ls -l,grep'^ d'和awk'{print $ 9}'的管道來創建shell腳本以打印完整的目錄樹。使用ls遞歸打印完整目錄樹的shell腳本

我寫了一個C程序來顯示我在找什麼。下面是輸出:

[email protected]:~/Documents/OS-Projects/Project5_DirectoryTree$ ./a.out 
TestRoot/ 
[Folder1] 
    [FolderC] 
    [FolderB] 
    [FolderA] 
[Folder2] 
    [FolderD] 
    [FolderF] 
    [FolderE] 
[Folder3] 
    [FolderI] 
    [FolderG] 
    [FolderH] 

我寫了這個至今:

ls -R -l $1 | grep '^d' | awk '{print $9}' 

打印目錄樹,但現在我需要一種方法通過文件夾深度和可能的縮進,但不需要排序。有什麼建議麼?我無法使用find或tree命令。

編輯:最初的作業&限制被誤認爲並在以後的日期更改。如果您忽視限制,現在的答案是很好的解決方案,所以請將其留給任何有類似問題的人。至於任何人想知道的新任務。我將遞歸地打印所有子目錄,對它們進行排序,然後將它們與我的程序進行比較,以確保它們具有相似的結果。這裏是我的解決辦法:

#!/bin/bash 
echo Program: 
./a.out $1 | sort 
echo Shell Script: 
ls -R -l $1 | grep '^d' | awk '{print $9}' | sort 

diff <(./a.out $1 | sort) <(ls -R -l $1 | grep '^d' | awk '{print $9}' | sort) 
DIFF=$? 

if [[ $DIFF -eq 0 ]] 
then 
    echo "The outputs are similar!" 
fi 
+2

當您使用awk時,您從不需要grep,因爲awk可以執行grep可以執行的任何操作(例如'grep'^ d'| awk'{print $ 9}''='awk'/^d/{print $ 9}''),遞歸查找目錄的工具是'find -type d',而不是'ls -R',這與diff或sort有什麼關係? –

+0

我明白這一點。限制,差異和排序只是給定作業的一部分。如果可以的話,我會盡可能不同地寫腳本。 – Ryan

+0

但是,你會比較什麼?你可以在腳本的某個地方拋出一個'diff/etc/password/dev/null>/dev/null'來使用'diff',我懷疑你是否會得到任何積分,但我無法想象你'd在這個問題中使用diff。 –

回答

2

你不需要既不ls也不grep也不awk用於獲取樹。簡單遞歸bash功能將enouh,如:

#!/bin/bash 
walk() { 
     local indent="${2:-0}" 
     printf "%*s%s\n" $indent '' "$1" 
     for entry in "$1"/*; do 
       [[ -d "$entry" ]] && walk "$entry" $((indent+4)) 
     done 
} 
walk "$1" 

如果你運行它bash script.sh /etc將打印目錄樹,如:

/etc 
    /etc/apache2 
     /etc/apache2/extra 
     /etc/apache2/original 
      /etc/apache2/original/extra 
     /etc/apache2/other 
     /etc/apache2/users 
    /etc/asl 
    /etc/cups 
     /etc/cups/certs 
     /etc/cups/interfaces 
     /etc/cups/ppd 
    /etc/defaults 
    /etc/emond.d 
     /etc/emond.d/rules 
    /etc/mach_init.d 
    /etc/mach_init_per_login_session.d 
    /etc/mach_init_per_user.d 
    /etc/manpaths.d 
    /etc/newsyslog.d 
    /etc/openldap 
     /etc/openldap/schema 
    /etc/pam.d 
    /etc/paths.d 
    /etc/periodic 
     /etc/periodic/daily 
     /etc/periodic/monthly 
     /etc/periodic/weekly 
    /etc/pf.anchors 
    /etc/postfix 
     /etc/postfix/postfix-files.d 
    /etc/ppp 
    /etc/racoon 
    /etc/security 
    /etc/snmp 
    /etc/ssh 
    /etc/ssl 
     /etc/ssl/certs 
    /etc/sudoers.d 
+0

您的解決方案非常酷,但原始文章中列出了_I的要求,必須使用diff和sort創建shell腳本,並使用ls -l,grep'^ d'和awk'{print $ 9}創建管道。打印一個完整的目錄樹._ –

+0

@RogerSinasohn,如果你忽視限制,這是一個關於原始問題的好方法。我添加了一個編輯,解釋了作業描述不正確,並添加了我的解決方案。 – Ryan

1

借用@ jm666的想法上運行它的/等:

$ find /etc -type d -print | awk -F'/' '{printf "%*s[%s]\n", 4*(NF-2), "", $0}' 
[/etc] 
    [/etc/alternatives] 
    [/etc/bash_completion.d] 
    [/etc/defaults] 
     [/etc/defaults/etc] 
      [/etc/defaults/etc/pki] 
       [/etc/defaults/etc/pki/ca-trust] 
       [/etc/defaults/etc/pki/nssdb] 
      [/etc/defaults/etc/profile.d] 
      [/etc/defaults/etc/skel] 
    [/etc/fonts] 
     [/etc/fonts/conf.d] 
    [/etc/fstab.d] 
    [/etc/ImageMagick] 
    [/etc/ImageMagick-6] 
    [/etc/pango] 
    [/etc/pkcs11] 
    [/etc/pki] 
     [/etc/pki/ca-trust] 
      [/etc/pki/ca-trust/extracted] 
       [/etc/pki/ca-trust/extracted/java] 
       [/etc/pki/ca-trust/extracted/openssl] 
       [/etc/pki/ca-trust/extracted/pem] 
      [/etc/pki/ca-trust/source] 
       [/etc/pki/ca-trust/source/anchors] 
       [/etc/pki/ca-trust/source/blacklist] 
     [/etc/pki/nssdb] 
     [/etc/pki/tls] 
    [/etc/postinstall] 
    [/etc/preremove] 
    [/etc/profile.d] 
    [/etc/sasl2] 
    [/etc/setup] 
    [/etc/skel] 
    [/etc/ssl] 
    [/etc/texmf] 
     [/etc/texmf/tlmgr] 
     [/etc/texmf/web2c] 
    [/etc/xml] 

對不起,我無法找到使用你提到所以它可能不會幫助你的其他工具明智的方式,但也許它會幫助其他有相同問題,但沒有要求使用特定的工具。

+1

同意。仍然有用!謝謝 – Ryan