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 中的数组可以包含任何非 NUL 字符,甚至是换行符(在 POSIX 文件名中有效)。其他方法不能保证保留文件名可能包含的特殊字符。

有关在 bash 中处理 find 输出的一般方法的更多信息,请参阅http://mywiki.wooledge.org/BashFAQ/001

于 2012-10-02T22:28:03.673 回答