Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带空格的Bash文件夹列表?_Bash_Shell - Fatal编程技术网

带空格的Bash文件夹列表?

带空格的Bash文件夹列表?,bash,shell,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/h

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


有没有办法解决这个问题?

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

[[ -n "$1" ]] || { echo "Usage: findlarge [PATHNAME]"; exit 0 ; }
find "$1" -type f -size +10000k -printf '%p;'
使用
以匹配现有代码,但您可以替换
\n
以在各自的行中输出每个文件。

请尝试以下操作:

#!/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"

您应该使用
-print0
发出文件名(保证输出的文件名与文件系统上存在的文件名完全相同),并将它们存储在一个数组中(这是在它们之间进行分隔的唯一方法,保证对所有可能的内容都有效)

[[-n“$1”]|{echo”用法:findlarge[PATHNAME]“退出0;”
文件=()
而IFS=''read-d'-r;做
文件+=(“$REPLY”)

完成<我仍然有相同的结果。这仍然受到awk仍然使用空格查找$9的影响。实际上,您不应该试图解析
ls
输出。使用
find-printf
stat
或其他方法。非常正确。。。我在测试输出中没有捕捉到这一点。使用
-printf
参数更新以正确输出文件名。如何将文件路径作为输出的一部分?我需要
/var/www/html/Web Content/space.zip的东西,而不仅仅是文件名。。。如果可能的话。用文件名中的空格测试OK。有没有办法也获得文件路径?@sputnick在你称之为好之前,用包含换行符的文件名测试一下(它们是合法的!)。就像whe在另一篇文章中在同样情况下说的,我们保留KISS principe。谁在文件名中添加换行符?十年来从未见过这种情况@sputnick-只是一个很小的改进:)在打印文件后添加一个EOL
echo-ne“$FILES\n”
抛出:
/lftp.sh:第12行:意外标记附近的语法错误
@Peter听起来像是在使用
/bin/sh
而不是bash。
[[ -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[@]}"