2009-08-26 76 views
15

我正在嘗試使用bash腳本遞歸文件夾並在其上運行命令。有什麼建議麼?遞歸讀取文件夾並對其執行命令

+3

問題不明。你只是想使用find來對給定目錄下的所有文件執行命令嗎? – 2009-08-26 10:48:23

+3

答案是在我的投票然後:) – drAlberT 2009-08-26 10:48:53

+0

我只是想重命名目錄下的所有文件 – Jinhua 2009-08-27 01:53:05

回答

41

如果你想遞歸到目錄中,對這些文件中的每個文件執行命令,我會使用find命令,而不是使用shell腳本寫任何東西。

該命令可以接收大量的參數,如type的文件返回到過濾的類型,或exec在每個結果執行命令。


例如,要查找目錄,是一個在我目前在:

find . -type d -exec echo "Hello, '{}'" \; 

這將讓我somehthing像:

Hello, '.' 
Hello, './.libs' 
Hello, './include' 
Hello, './autom4te.cache' 
Hello, './build' 
Hello, './modules' 


同樣找到當前目錄下的文件:

find . -type f -exec echo "Hello, '{}'" \; 

這將讓我這樣的事情:

Hello, './config.guess' 
Hello, './config.sub' 
Hello, './.libs/memcache_session.o' 
Hello, './.libs/memcache_standard_hash.o' 
Hello, './.libs/memcache_consistent_hash.o' 
Hello, './.libs/memcache.so' 
Hello, './.libs/memcache.lai' 
Hello, './.libs/memcache.o' 
Hello, './.libs/memcache_queue.o' 
Hello, './install-sh' 
Hello, './config.h.in' 
Hello, './php_memcache.h' 
... 


有人會說,「這不是空殼」 ......但是,爲什麼重新發明輪子呢?
(並且,在某種程度上,它是殼^^)


欲瞭解更多信息,你可以看看:

+0

如果您需要重命名目錄以及文件遞歸檢查出這個答案:http://stackoverflow.com/questions/ 4268591/unix-rename-files-directories-to-uppercase – JJones 2013-12-11 08:59:42

+0

謝謝。我怎麼會調整這隻看我的當前目錄的子目錄,而不是尋找子目錄 – 2017-10-18 09:51:04

+0

啊。像這樣:'找。 -maxdepth 1 -type d -exec echo「Hello,'{}'」\;' – 2017-10-18 09:52:37

1

看一看的find命令,檢查開關-type(使用d指定目錄)和-exec(指定要執行的命令)。

3

對不起,我不明白你在問什麼。我可以用你的問題想最好的是

find -type d -exec scriptname.sh \{\} \; 
+0

在這種情況下,腳本會在每個目錄內執行嗎? – Sigur 2016-11-26 13:37:48

+1

不,腳本在'find'的位置執行。 – 2016-12-09 13:08:43

0

對於大多數遞歸文件操作,要使用find,作爲其他的答案解釋。

bash-doc包中包含一個遞歸bash腳本示例。如果你已經安裝了這些示例,它將在/usr/share/doc/bash/examples/functions/recurse(在Debian上)。

7

像這樣的東西應該實現自己的目標:

function RecurseDirs 
{ 
    oldIFS=$IFS 
    IFS=$'\n' 
    for f in "[email protected]" 
    do 
    -----your activity here----- 
     if [[ -d "${f}" ]]; then 
      cd "${f}" 
      RecurseDirs $(ls -1 ".") 
      cd .. 
     fi 
    done 
    IFS=$oldIFS 
} 
+1

[請勿解析'ls'](http://mywiki.wooledge.org/ParsingLs),請! – 2015-10-27 17:30:02

3

一些基本的殼錯過命令,如「查找」和他們的一些命令不支持遞歸性。 在這種情況下,你可以使用這個腳本在樹中的所有子目錄運行所需的命令:

CDIR=$(pwd) 
for i in $(ls -R | grep :); do 
    DIR=${i%:}     # Strip ':' 
    cd $DIR 
    $1       # Your command 
    cd $CDIR 
done 

如果命名上面的「recurse.sh」,然後使用:

./recurse.sh <command> 

例(所有者/組更改爲樹中的所有文件的「根」):介紹了globstar選項

./recurse.sh "chown 0:0 *" 
+0

[不要分析'ls'](http://mywiki.wooledge.org/ParsingLs),請! – 2015-10-27 17:29:37

相關問題