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 に答える
0

その ID を取得するにはいくつかの方法があります。1 つは次の方法です。

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 に答える