テキストファイルソースからファイル名を変更するBashスクリプト

テキストファイルソースからファイル名を変更するBashスクリプト

私は初めてbashに触れました。簡単なコマンドを使用して、一度に1つの簡単な管理タスクを実行できます。しかし、私はテキストファイルを名前変更ソースとして使用してディレクトリ内のいくつかのファイル名を変更するという任務を担当しており、私の能力をはるかに超えているので、いくつかのアドバイスに本当に感謝しています。

説明します。

New File Name.xlsx 0.1  000011F4.dat 
New File Name.xlsx 0.2  000011F5.dat 
New File Name.xlsx 0.3  000011F6.dat 
New File Name.xlsx 0.4  000011F7.dat 
New File Name.xlsx 0.5  000011F8.dat 
New File Name.xlsx 0.6  000011F9.dat 

私のソーステキストファイルは上記と似ています。目的は、最初の「列」がファイルの新しい名前、中間がバージョン、3番目の列が現在のファイル名であることです。

ディレクトリ内の.datファイルの名前を最初の列に表示されている名前に変更する必要があります。また、各ファイルの先頭にバージョン番号0.1、0.2などを追加する必要があります。

いくつかの質問があります。

ファイルにスペースがあるのは大きな問題ですか?各ファイル文字列の周りに ""を追加する方が良いですか?

基本的にどこから始めるべきかわかりません。助けてくれてありがとう。ご覧のとおり、ファイル名の先頭にバージョン列を追加し、リストにスペースを追加する必要がある一般的な名前変更よりも少し複雑です。

ベストアンサー1

これは働きます:

sh <(sed -r 's/^\s*(.*)\s+([0-9\.]+)\s+([0-9A-Z]{8}\.dat)\s*$/mv -iv \3 "\2 \1"/' files)

...filesソースファイルの名前がある場所です。

これは、次のようにコマンドの結果をsed(シェル)の新しいインスタンスに渡すことです。shプロセスの交換。このコマンドの出力は次のsedとおりです。

mv -iv 000011F4.dat "0.1 New File Name.xlsx"
mv -iv 000011F5.dat "0.2 New File Name.xlsx"
mv -iv 000011F6.dat "0.3 New File Name.xlsx"
mv -iv 000011F7.dat "0.4 New File Name.xlsx"
mv -iv 000011F8.dat "0.5 New File Name.xlsx"
mv -iv 000011F9.dat "0.6 New File Name.xlsx"

このsedコマンドを分析してパターンを検索します。

  • ^- 行の始まり
  • \s*- 最初にスペースがある場合
  • (.*)- すべての文字(結果は括弧内に保存されます\1
  • \s+- 少なくとも1つの空白文字
  • ([0-9\.]+)0-9- と1つ以上.(に保存\2
  • \s+- 少なくとも1つの空白文字
  • ([0-9A-Z]{8}\.dat)0-9A-Z- 中やそれに続く8文字.dat(に保存\3
  • \s*- 最後にスペースがある場合
  • $- 行末

...これをに置き換えますmv -iv \3 "\2 \1"。ここで、 \1to\3は以前に保存された値です。必要に応じて、バージョン番号とファイル名の残りの部分の間にスペース以外のものを使用できます。

結果は次のとおりです。

$ ls -l
total 60
-rw-rw-r-- 1 z z   0 Aug  8 14:15 000011F4.dat
-rw-rw-r-- 1 z z   0 Aug  8 14:15 000011F5.dat
-rw-rw-r-- 1 z z   0 Aug  8 14:15 000011F6.dat
-rw-rw-r-- 1 z z   0 Aug  8 14:15 000011F7.dat
-rw-rw-r-- 1 z z   0 Aug  8 14:15 000011F8.dat
-rw-rw-r-- 1 z z   0 Aug  8 14:15 000011F9.dat
-rw-rw-r-- 1 z z 222 Aug  8 13:47 files
$ sh <(sed -r 's/^\s*(.*)\s+([0-9\.]+)\s+([0-9A-Z]{8}\.dat)\s*$/mv -iv \3 "\2 \1"/' files)
`000011F4.dat' -> `0.1 New File Name.xlsx'
`000011F5.dat' -> `0.2 New File Name.xlsx'
`000011F6.dat' -> `0.3 New File Name.xlsx'
`000011F7.dat' -> `0.4 New File Name.xlsx'
`000011F8.dat' -> `0.5 New File Name.xlsx'
`000011F9.dat' -> `0.6 New File Name.xlsx'
$ ls -l
total 60
-rw-rw-r-- 1 z z   0 Aug  8 14:15 0.1 New File Name.xlsx
-rw-rw-r-- 1 z z   0 Aug  8 14:15 0.2 New File Name.xlsx
-rw-rw-r-- 1 z z   0 Aug  8 14:15 0.3 New File Name.xlsx
-rw-rw-r-- 1 z z   0 Aug  8 14:15 0.4 New File Name.xlsx
-rw-rw-r-- 1 z z   0 Aug  8 14:15 0.5 New File Name.xlsx
-rw-rw-r-- 1 z z   0 Aug  8 14:15 0.6 New File Name.xlsx
-rw-rw-r-- 1 z z 222 Aug  8 13:47 files

おすすめ記事