Linux批量根据文件名模式将文件复制到目录中

时间:2016-08-22 22:12:28

标签: linux bash shell awk sed

我列出了近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

感谢您的支持。

2 个答案:

答案 0 :(得分:5)

您可以使用:

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

答案 1 :(得分:1)

正如ed-morton正确指出的那样,这是 NOT 推荐的解决方案,因为它在许多情况下都失败了。请关注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