如何列出文件名中包含空格的文件?

如何列出文件名中包含空格的文件?

我正在尝试使用如下所示的 for 循环,通过将参数传递给函数来逐个读取文件。由于文件名中存在空格,参数 3 会产生很多问题。

例子:

source_file_restructure()
{

echo "inside the function"
source_folder=$1
target_folder=$2
file_pattern=$3
delimiter=$4


echo $file_pattern


echo " Getting inside the function.... "


for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`
do

some processing.......

done

当文件包含空格(例如文件 1.csv)时,上述 ls 命令无法正常工作,

输入 :

SOurce Folder : /home/test/

File Pattern : "file"

Function argument : 
source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}

建议一些选项来处理该问题。

答案1

代替

for file_name in `ls -Al ${source_folder}*"${file_pattern}"*.csv`

和:

for file_name in "${source_folder}"*"${file_pattern}"*.csv

反引号中的命令输出(如上面的第一种形式)会受到分词的影响。上面的第二种形式不使用反引号。相比之下,它可以处理任何文件名,甚至包含空格、制表符、换行符或任何其他困难字符的文件名。

另外,更换

source_file_restructure ${source_folder} ${target_folder} "${file_pattern}" ${delimiter}

source_file_restructure "${source_folder}" "${target_folder}" "${file_pattern}" "${delimiter}"

如果没有双引号,shell 将执行分词。使用双引号,即使source_foldertarget_folder有空格、制表符、换行符或其他困难字符,该函数也将被正确调用。

答案2

您必须在第一个脚本中设置以下环境变量:

IFS=$(echo -en "\n\b")

答案3

我在我的一个脚本中使用了类似的东西:

ls -Q "$folderToRead" | while read file # ls -Q puts every entry between quotes : "file".
do
    file=`echo $file | tr -d '"'` # This erases the quotes from the -Q argument, so you 
                                    # can work on the file without worrying about it.

当然,您必须通过编辑 ls 命令使其在脚本中运行。我刚刚写了简短的版本。

相关内容