2012-10-02 127 views
1

我有下面的代碼,發現有超過10 MB的特定文件:帶空格的Bash文件夾列表?

[[ -n "$1" ]] || { echo "Usage: findlarge [PATHNAME]"; exit 0 ; } 
FILES=`find $1 -type f -size +10000k -exec ls -lh {} \; | awk '{ print $9 ";" }'` 

echo -ne $FILES 

它工作得很好,直到它運行到,在它有一個空間的文件路徑。因此,例如我有一個文件夾,其中有一個大文件/var/www/html/Web Content/largefile.zip,但該腳本將只返回/var/www/html/Web

任何想法如何解決這個問題?

回答

1

把你$1到引號來操作的空間,並使用-printf參數輸出文件列表:

[[ -n "$1" ]] || { echo "Usage: findlarge [PATHNAME]"; exit 0 ; } 
find "$1" -type f -size +10000k -printf '%p;' 

使用;,以配合您現有的代碼,但您可以替換\n輸出的每個文件上它自己的路線。

+0

我仍然有同樣的結果。 – Peter

+0

這仍然患有http://mywiki.wooledge.org/BashPitfalls/#for_i_in_.24.28ls_.2A.mp3.29 –

+1

awk仍在使用空格來查找$ 9。真的,你不應該試圖解析'ls'輸出。使用'find -printf'或'stat'或其他東西。 –

1

嘗試以下方法:

#!/bin/bash 

[[ -n "$1" ]] || { echo "Usage: findlarge [PATHNAME]"; exit 0 ; } 

FILES="$(find "$1" -type f -size +10000k -printf '%Ts %p\n' | cut -d ' ' -f2-)" 

echo "$FILES" 
+0

測試OK,文件名中有空格。 –

+0

有沒有辦法獲得文件路徑? – Peter

+0

POST編輯相應彼得;) –

1

你應該發射具有-print0文件名(因爲它們在文件系統中存在這是保證將它們輸出恰好),並在陣列中存儲它們(這是在他們之間劃分的唯一方法是保證適用於所有可能的內容)。

[[ -n "$1" ]] || { echo "Usage: findlarge [PATHNAME]"; exit 0 ; } 

files=() 
while IFS='' read -d '' -r; do 
    files+=("$REPLY") 
done < <(find "$1" -type f -size +10000k -print0) 

printf '%s\n' "${files[@]}" 

bash中的數組可以包含任何非NUL字符,甚至是換行符(在POSIX文件名中有效)。其他方法不能保證保留可能包含文件名的特殊字符。

有關這個一般做法在bash發現來自輸出處理的詳細信息,請參閱http://mywiki.wooledge.org/BashFAQ/001

+0

拋出:'./lftp.sh:第12行:意外標記附近的語法錯誤'<' ./lftp。sh:第12行:'done < Peter

+0

@Peter聽起來像是使用'/ bin/sh'而不是bash。 –

相關問題