我有以下代码来查找超过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
。
任何想法如何解决?
答案 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