2016-04-21 22 views
2

我不需要在一行內完成此操作,但目前爲止只有一行。Bash - 在文件之前列出目錄名稱的所有子目錄中的程序

find . -perm -111 +type f | sort -r 

我試圖做的是寫一個bash腳本,將顯示在當前目錄是可執行(Z到A)中的所有文件的列表。我希望腳本對所有子目錄都做同樣的事情。我遇到的困難是在該目錄/子目錄中的可執行文件列表之前顯示該子目錄的名稱。

所以,澄清,理想的輸出可能是這樣的:

program1 
program2 
SubDir1 
program3 
SubDirSubDir2 
program4 
SubDir2 
program5 

我有什麼權利現在(上面的代碼)做到這一點。它沒有刪除/路徑,它沒有列出目錄改變時新目錄的名稱。

./exfile 
./test/exfile1 
./test1/program2 
./test1/program 
./first 

希望這是明確的。

+0

你的意思是,對於每個目錄,你要首先顯示所有的目錄,然後是文件嗎?你想要什麼樣的順序在目錄可循? – paddy

+0

爲了澄清,我想打印的可執行文件程序放在當前目錄中,然後打印第一個子目錄的名稱並列出每個程序。然後針對所有子目錄(遞歸地)執行此操作。 – jonbon

+0

@paddy在原始文章中添加了新信息 – jonbon

回答

1

這將工作。

我將權限更改爲-100,因爲某些程序只能由其所有者執行。

for d in $(find . -type d); do 
    echo "in $d:" 
    find $d -maxdepth 1 -perm -100 -type f | sed 's#.*/##' 
done 
0

這將爲你做的伎倆。

find . -type d | sort | xargs -n1 -I{} bash -c "find {} -type f -maxdepth 1 -executable | sort -r" 

第一個find命令列出所有目錄和子目錄並按升序對它們進行排序。

然後將排序的目錄/子目錄傳遞給xargs,它調用bash來查找目錄/子目錄內的文件並按降序對它們進行排序。

如果您還希望打印該目錄,則可以在不使用-type f的情況下運行該目錄。

0

您可以使用所有目錄find-print結合起來(打印目錄名)和-exec(在該目錄中執行查找文件):

find . -type d -print -exec bash -c 'find {} -type f -depth 1 -perm +0111 | sort -r' \; 

讓我們打破下來。首先,你必須在目錄搜索:

find . -type d -print 

然後要執行的命令爲每個目錄:

find {} -type f -depth 1 -perm +0111 | sort -r 

只要它看到{}-exec開關將擴大的路徑。因爲它使用的是shell語法的管道操作符,所以整個事情都被包裝在bash -c中。

您可以進一步擴展。如果你想要去除的目錄名關的文件和空間我們的搜索結果更好,這樣的事情可能就足夠了:

find {} -type f -depth 1 -print0 -perm +0111 | xargs -n1 -0 basename | sort -r && echo 
0

嗯,分揀要求使這一棘手 - 在「在$ d(找.. 。。?)」命令很聰明,但很難控制分揀這個怎麼樣一切都是Z->一,包括目錄,但awk的說法是有點怪的; _)

find `pwd` -perm 111 -type f | sort -r | xargs -n1 -I{} sh -c "dirname {};basename {}" | awk '/^\// {dir=$0 ; if (dir != lastdir) {print;lastdir=dir}} !/^\// {print}'

產生

/home/imcgowan/t/t3 jjj iii hhh /home/imcgowan/t/t2 ggg fff eee /home/imcgowan/t/t1 ddd ccc bbb /home/imcgowan/t aaa

相關問題