2015-01-10 121 views
0

服務器上有一個腳本,我需要運行該文件夾中的所有文件。在編寫shell腳本重複遍歷文件夾中所有文件的腳本

for input in /home/arashsa/duo-bokmaal/Bokmaal/DUO_BM_28042.txt ; do 
    name=$(basename "$input") 
    /corpora/bokm/tools/The-Oslo-Bergen-Tagger/./tag-lbk.sh "$input" > "/home/arashsa/duo-bokmaal-obt/$name" 
done 

我是可怕的,並沒有成功地發現瞭如何遍歷文件:要運行此腳本在一個文件我用這個shell腳本。我想要的是讓腳本迭代給定文件夾中以.txt結尾的所有文件,而不是以_metadata.txt結尾的文件。所以我想我會給它作爲參數的文件夾路徑,使其遍歷該文件夾中的所有文件,並運行腳本上以txt結尾的文件,而不是_metadata.txt

回答

0

在bash:

shopt -s extglob 

for input in /dir/goes/here/*!(_metadata).txt 
do 
    ... 
done 
+0

我該如何轉換這個目錄是作爲參數而不是硬編碼給出的?美元符號替換是否夠了? –

1

使用find和exec選項。

$ find /path/to/dir -exec <command here> \; 

每個文件或目錄都可以使用{}獲取。

用法示例:$ find . -exec echo {} \;,這將在當前目錄中遞歸地回顯每個文件名或目錄名。您可以使用一些其他選項來進一步指定想要處理的所需文件和目錄。我將簡要解釋其中的一些。請注意,echo是多餘的,因爲find的輸出會自動打印,但我會留下來說明exec的工作。這是說,下面的命令產生相同的結果:$ find . -exec echo {} \;$ find .

MAXDEPTH和mindepth 指定MAXDEPTH和mindepth讓你深下去的目錄結構,只要你喜歡。 Maxdepth確定find將進入目錄的次數,mindepth決定在選擇文件或目錄之前應該輸入目錄的次數。

示例用法: (1)僅列出此目錄中的元素,包括。 (=當前目錄)。 (2)僅列出當前目錄排除的元素。 從根目錄(3)列出的元件和所有顯示目錄在這個目錄

(1)$ find . -maxdepth 1 -exec echo {} \; 
(2)$ find . -mindepth 1 -maxdepth 1 -exec echo {} \; 
# or, alternatively 
(2)$ find . ! -path . -maxdepth 1 -exec echo {} \; 
(3)$ find/-maxdepth 2 -exec echo {} \; 

類型 指定類型選項可以過濾的文件或僅目錄,例如使用: (1)列表中的所有文件中這個目錄 (2)在根目錄中的每個目錄上調用shell腳本函數func

(1)$ find . -maxdepth 1 -type f -exec echo {} \; 
(2)$ find/-maxdepth 1 -type d -exec func {} \; 

名&正則表達式 名稱選項,您可以搜索特定的文件名,你也可以看看使用正則表達式格式的文件,並顯示目錄。

實例:找到某個目錄

$ find /path/to/dir -maxdepth 1 -regextype sed -regex ".*\.\(avi\|mp4\|mkv\)" 

大小 另一個過濾器是文件大小的任何文件或目錄大於該值將被返回的所有電影。用法示例: (1)查找當前目錄中的所有空文件。 (2)找到當前目錄中的所有非空文件。

(1)$ find . -maxdepth 1 -type f -size 0 
(2)$ find . -maxdepth 1 -type f ! -size 0 

進一步的例子 移動這個目錄中的所有文件到一個目錄tmp出現在.

$ find . -type f -maxdepth 1 -exec mv {} tmp \; 

轉換所有的MKV文件的MP4文件在目錄/路徑/到/目錄和兒童目錄

$ find /path/to/dir -maxdepth 2 -regextype sed -regex ".*\.mkv" -exec ffmpeg -i {} -o {}.mp4 \; 

將所有jpeg文件轉換爲png(不要這樣做,它會花費很長時間都能找到並轉換它們)。

$ find ~ -maxdepth 420 -regextype sed -regex '.*\.jpeg' -exec mogrify -format png {} \; 

find命令是一個強有力的工具,它可以被證明是卓有成效到管道輸出到xargs。需要注意的是這種方法優於以下的建設是非常重要的:

for file in $(ls) 
do 
    some commands 
done, 

,因爲後者將處理包含空格的方式不對文件和目錄。

相關問題