2014-03-30 183 views
-1

我试图编写一个脚本,该脚本在文件列表上工作。如果我想在同一个目录中的所有文件工作,然后Bash - 转换逗号分隔列表

FILES=*.ext 

for i in $FILES; do 
    something on "$i" 
done 

工程确定,问题是当我想要的工作只是一个选择的文件,而不是一切。如何将逗号分隔的文件列表(可能包含或不包含空格)转换为相同的格式,以便我可以将其保存在$ FILES中并使用相同的代码?

非常感谢,提前

大卫·肖

+2

你介意提供一些样本数据吗? – Saucier

回答

1

做的是不使用文件名的分隔列表,但使用一个数组(避免大写变量名)正确的事情,这将避免的问题包含您的分隔符(如,)文件名和是惯用的做法:

files=(*foo*.ext1 *bar*.ext2 file1 "file 2 with a space") 

for file in "${files[@]}"; do 
    [ -e "${file}" ] || continue 
    do_something_with "${file}" 
done 

除非你有过怎样$files人口无法控制这是你想要的,如果你的脚本被喂以通讯一个单独的列表,你完全无法避免它,那么你可以相应地设置IFS,如@ BroSlow的answer

由于globbing在用空格扩展文件名时没有问题(即使在您的示例中也没有)。

您可能还想检查extended globbing (extglob)以便能够更具体地匹配。

0

如果我正确解释您的问题,您可以将中的内部字段分隔符(IFS)改为逗号,然后用文字分割处理其余部分(例如,

#!/bin/bash 

FILES="file1,file2 with space,file3,file4 with space" 

IFS=',' 
for i in $FILES; do 
    echo "File = [$i]" 
done 

这将输出

File = [file1] 
File = [file2 with space] 
File = [file3] 
File = [file4 with space] 

注意,如Adrian Frühwirth pointed out in comments,如果文件名可以包含逗号,这将失败。

+0

是的,但这不是你如何做到的。你只是改变了问题,现在它会用逗号分隔文件名。 –

+0

@AdrianFrühwirth我仍然在解释这个问题,因为他有一个用逗号分隔的文件列表,并且想要遍历它。如果文件名本身可以包含逗号,那么问题几乎无法解决。 – BroSlow

+0

我认为这是一个XY问题,OP只需要知道他们不应该存储 - 也不是必需的 - 一个逗号分隔的文件/模式列表。如果你使用一个数组并正确地做,你可以避免所有这些问题。 –

相关问题