Linux基于文件名模式批量复制文件到目录中



我有一个将近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

感谢您的支持

您可以使用:

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

正如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