【问题标题】:Linux batch copy files into directories based on filename patternLinux 根据文件名模式将文件批量复制到目录中
【发布时间】:2016-12-29 14:15:29
【问题描述】:

我有一个包含以下文件名结构的近 500 个 pdf 文件的列表:

XXXX-YYYY-MM-DD.pdf

其中XXXX 是可变长度的数字代码(1 到 4 位),始终以“-”分隔,例如:

51-2016-08-22.pdf
776-2016-08-22.pdf
3881-2016-08-22.pdf
4-2016-08-22.pdf
2860-2016-08-22.pdf

目标是将每个文件复制到其自己的目录中,将目录命名为模式(即:文件 776-2016-08-22.pdf 转到目录 776)。如何使用 awk 或 sed 来分隔可变长度字段?

这是我的代码:

for f in *.pdf

    do
        FOLDERNAME=`echo $f| awk (awk or sed missing code here)`
        mkdir /my/dir/structure/$FOLDERNAME
        cp $f /my/dir/structure/$FOLDERNAME/
    done

感谢您的支持。

【问题讨论】:

标签: linux bash shell awk sed


【解决方案1】:

你可以使用:

for f in *.pdf; do
    d="${f%%-*}"
    mkdir -p "$d" && cp "$f" "$d"
done

【讨论】:

  • 感谢@anubhava 的帖子。相同的语法是否也适用于提取文件名的一部分,或者我应该为此目的使用 sed 吗?例如:如果我还必须使用年份 (YYYY) 作为文件夹名称创建子文件夹,您会推荐哪种语法?
  • 对于使用年份部分创建目录,我建议使用 BASH 正则表达式,如下所示:for f in *.pdf; do [[ $f =~ ^[^-]+-([0-9]{4})- ]] && echo mkdir -p "${BASH_REMATCH[1]}"; echo cp "$f" "$d"; done
【解决方案2】:

正如ed-morton 正确指出的那样,这是推荐的解决方案,因为它在许多情况下都失败了。请关注https://stackoverflow.com/a/39089589/3834860

保留此答案以供参考。

awk -F '-' 指定分隔符,'{print $1}' 指定分隔符之前的第一个元素。

for f in *.pdf

do
    FOLDERNAME=`echo $f| awk -F '-' '{print $1}'`
    mkdir /my/dir/structure/$FOLDERNAME
    cp $f /my/dir/structure/$FOLDERNAME/
done

【讨论】:

  • 感谢 @EdMorton 的 cmets。
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2016-04-09
  • 2019-10-30
  • 2012-08-21
  • 1970-01-01
  • 2015-07-31
相关资源
最近更新 更多