1

10 MB を超える特定のファイルを見つけるための次のコードがあります。

[[ -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.

それを修正する方法はありますか?

4

3 に答える 3

1

$1スペースを処理するために引用符で囲み、引数を使用して-printfファイル リストを出力します。

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

を使用して既存のコードと一致させますが、各ファイルを別の行に出力するように;置き換えることができます。\n

于 2012-10-02T22:16:09.140 に答える
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"
于 2012-10-02T22:16:19.187 に答える
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 の配列には、改行 (POSIX ファイル名で有効) を含め、NUL 以外の文字を含めることができます。他のアプローチでは、ファイル名に含まれる特殊文字が保持される保証はありません。

find からの出力を bash で処理するこの一般的な方法の詳細については、http://mywiki.wooledge.org/BashFAQ/001 を参照してください。

于 2012-10-02T22:28:03.673 に答える