ソースから読み取った後のファイルのバッチの名前変更

ソースから読み取った後のファイルのバッチの名前変更

1000以上のファイルでいっぱいのディレクトリがありますが、名前が少し長くなります(名前付きスタイルではパターンが見つかりません)。ファイル名を単純化したいです。たとえば、

Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb

.....など!

filelist.txt次の内容で簡単なテキストファイル()を作成しました。

1.pdb   Bioimage_23335989_Data_22317866_22317867_20140723_1002.pdb
2.pdb   Bioimage_22335990_Data_22318490_22318491_20140723_1009.pdb
3.pdb   Bioimage_23835970_Data_22317866_22317867_20140723_1005.pdb

.....など!

誰もがソースファイルを読み取ってファイル名を変更するスクリプト(など)を提供できますかawksed他の場所でも同様のスクリプトを取得できますが、私には何も機能しないようです。

答え1

filelist.txtフォーマットはすでに完璧なので、awkやsedは必要ありません。

いくつかの事前に言うことは...ファイル名にスペースがなく、各行の2つのファイル名がスペースで区切られていると仮定します。また、私は仮定するfilelist.txt 終了EOFの前にEOLがあります。

もちろん、このコマンドを実行する前にディレクトリをバックアップしてください。

#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
  mv $line
done < /path/to/filelist.txt

説明する

  • while read -r line; do:ファイル内の各行を繰り返して、各行を変数に配置します$line
  • mv $line:各行にはスペースで区切られた2つのファイル名が含まれているため、引数を.ieに直接渡すことができますmv。これにより、ファイルは最初のファイル名から2番目のファイル名に即座に移動されます。

編集する

ちょうどあなたの質問をもう一度読んだ。私はこれをファイル名を(たとえば)から1.pdbに変更したいという意味に解釈しますBioimage_23335989_Data_22317866_22317867_20140723_1002.pdb。その反対が欲しいのかよくわかりません。その場合、以下のスクリプトが機能します。

#!/usr/bin/env bash
cd /path/to/pdb_files
while read -r line; do
  mv $(awk '{print $2, $1}' <<<$line)
done < /path/to/filelist.txt

説明する

  • mv $(awk '{print $2, $1}' <<<$line)$line2番目のフィールドを読み取り、印刷してから1番目のフィールドを印刷します。これら2つのファイル名をに引数として渡しますmv

答え2

while read tname fname
do
  mv ${fname} ${tname}
done < filelist.txt

関連情報