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
.....など!
誰もがソースファイルを読み取ってファイル名を変更するスクリプト(など)を提供できますかawk
?sed
他の場所でも同様のスクリプトを取得できますが、私には何も機能しないようです。
答え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)
:$line
2番目のフィールドを読み取り、印刷してから1番目のフィールドを印刷します。これら2つのファイル名をに引数として渡しますmv
。
答え2
while read tname fname
do
mv ${fname} ${tname}
done < filelist.txt