4

我在单个目录中有一个文件列表,例如..

LDI_P1800-id1.0200.bin
LDI_P1800-id2.0200.bin
...
LDI_P1800-id17.0200.bin
LDI_P1800-id18.0200.bin
...
...
LDI_P1800-id165.0200.bin
LDI_P1800-id166.0200.bin
...

我想将它们中的每一个移动到目录中

LDI_P1800-id165.0200.bin to ../id165/.
LDI_P1800-id166.0200.bin to ../id166/.
LDI_P1800-id167.0200.bin to ../id167/.
...

等等。

我的猜测是我必须使用正则表达式从字符串中提取 id

for file in *.0200.bin ; do
    "extracting id from each file"
    mv $file ../id$id/.
done

任何机构都可以帮我吗?谢谢!!

4

3 回答 3

6

尝试以下纯 bash 解决方案:

for file in *.0200.bin
do
    id=${file#*-}      # delete everything upto the first hyphen
    id=${id%%.*}        # delete everything after the first dot
    [[ ! -d ../$id ]] && mkdir ../$id       # if the directory doesn't exist create it
    mv $file ../$id
done

它也可以在 中完成sed,但我更喜欢第一种方法:

for file in *.0200.bin
do
    id=$(sed 's/[^-]*-\([^\.]*\).*$/\1/g' <<< $file)
    mkdir -p ../$id && mv $file ../$id
done
于 2012-12-21T13:59:21.427 回答
1

您也可以使用正则表达式(不仅仅是模式匹配)bash

for f in *.0200.bin; do
    [[ $f =~ id[0-9]+ ]] && mv -- "$f" ../${BASH_REMATCH[0]}
done

BASH_REMATCH是一个包含最近=~匹配结果的数组。第 0 个元素包含匹配整个正则表达式的字符串。非零索引保存与正则表达式中第 *n* 个括号组匹配的结果(如果有)。

于 2012-12-21T18:16:46.707 回答
0

有几种方法可以检索该 id,一种是使用以下方法:

ID=$(echo $file | grep -o "id[[:digit:]]*\." | cut -b3- | tr -d '.')

它使用 grep 隔离id[DIGITS].表达式,然后剪切id它的一部分,最后.使用删除字符tr

实际上,您可以id[DIGITS]像这样隔离整个部分并在循环中使用它:

for file in *.0200.bin ; do
    echo "extracting id from each file"
    ID=$(echo $file | grep -o "id[[:digit:]]*\." | tr -d '.')
    mv $file ../$ID/.
done

更新:正如@dogbane 所建议的,它可以进一步简化为:

for file in *.0200.bin ; do
    echo "extracting id from each file"
    ID=$(grep -o "id[[:digit:]]*" <<< $file)
    mv $file ../$ID/.
done
于 2012-12-21T13:54:39.437 回答