Bash从我的文件名中删除下划线?

时间:2015-08-11 22:09:49

标签: bash amazon-s3

我试图将文件从一个S3存储桶移动到另一个存储桶并按日期将它们放入文件夹结构中。简单地说,目前所有文件都进入一个文件夹,该文件夹里面有超过500,000个文件,我现在需要对所有这些文件进行排序,并按月将它们放入文件夹中。

文件名类似于: " This_is_a_file_20150403.xml"

所以我遍历S3存储桶中的所有文件,tokensize并获取日期。我创建了一个忽略日期的年月变量并将它们移动到另一个S3存储桶中。但文件名更改为: "这是一个文件20150403.xml"

因此,当我尝试移动它时,AWS无法找到该文件。为什么bash从文件名中删除了下划线?我尝试暂时将文件名存储在tempFilename中,但仍然删除了下划线。

我目前的代码是:

#!/bin/bash

count=0

for filename in $(aws s3 ls s3://stagingbucket)
do
    echo $filename
    tempFilename=$filename
    (IFS='_'; for word in $filename;
    do
        echo $filename
        if [ "$count" -eq 2 ]; then
            yearmonth=${word:0:6}
            echo $tempFilename
            aws s3 cp s3://stagingbucket/$filename s3://archivebucket/$yearmonth/
        fi
        count=$((count + 1))

    done)
done

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

让我们来看看你的代码实际上做了什么。

echo $foo
  1. 字符串拆分$foo,根据IFS
  2. 中的字符将其分成几部分
  3. 将每个片段评估为glob表达式
  4. 将这些glob表达式的每个结果作为单独的参数传递给echo
  5. echo然后打印那些带有空格的参数。
  6. 相反,请使用:

    echo "$foo"
    

    ...将你的字符串保持在一起 - 同样,也引用你所有的其他扩展。

    出于同样的原因(非预期的glob表达式),for word in $filename是邪恶的;不要这样做。

    IFS=_ read -a words <<<"$filename"
    for word in "${words[@]}"; do
      echo "Processing $word"
    done