特定のファイル名を抽出し、その名前のフォルダに入れます。

特定のファイル名を抽出し、その名前のフォルダに入れます。

私は初めてBash、Ubuntu 16.04を使用します。

次のファイルがたくさんあります。

aaaa1111
aaaa1112
aaaa1113
aaaa1114 ...

aaab1111
aaab1112
aaab1113
aaab1114 ...

aaac1111 
aaac1112 ... (and so on ...)

とにかくパターンは4桁+数字です。私がしなければならないのは、この4つの文字に基づいてディレクトリを作成し、そのディレクトリにそのファイルを配置することだけです。

例えば、

aaaa1111
aaaa1112
aaaa1113
aaaa1114 ...

aaaa ディレクトリに保存されます。

aaab1111
aaab1112
aaab1113
aaab1114 ...

aaab ディレクトリに保存されます。

「sed」、「mv」などを試しましたが、うまく動作しません。

答え1

for file in [a-z][a-z][a-z][a-z][0-9][0-9][0-9][0-9]; do
    mkdir -p "${file:0:4}" && mv "$file" "${file:0:4}"
done

-loopは、for4文字と4桁の数字を使用して現在のディレクトリのファイル名を繰り返し、file各ステップで変数にファイル名を割り当てます。

mkdir宛先ディレクトリを作成します。フラグを使用すると、ディレクトリが-pすでに存在し、${file:0:4}現在のファイル名の最初の4文字を保持している場合にエラーメッセージが表示されるのを防ぎます。コマンドが成功すると、ファイルはこのディレクトリに移動されます。

答え2

私はこれが可能だと思います:

cd your_source_dir || exit

for file in *; do
  if [[ $(echo "$file" | grep -Pw "[a-z]{4}[0-9]{4}") ]]; then
    dir="${file:0:4}"
    [[ -d "$dir" ]] || mkdir "$dir"
    [[ -f "$file"]] && mv "$file" "$dir/"
  fi
done

関連情報