Bash文件夹列表中有空格?

时间:2012-10-02 22:14:28

标签: bash shell

我有以下代码来查找超过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

任何想法如何解决?

3 个答案:

答案 0 :(得分:1)

$1放入引号以处理空格,并使用-printf参数输出文件列表:

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

使用;匹配您现有的代码,但您可以用\n替换每个文件的输出。

答案 1 :(得分: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"

答案 2 :(得分: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