sedとcsvを使用してファイル名を変更する方法

sedとcsvを使用してファイル名を変更する方法

私はLinuxに初めて触れましたが、sed新しいawkアイデアに挑戦することを気にしません。つまり、すべてのファイルにaを追加または削除するなど、一般的なイベントを使用してrename処理sedする目的と方法を理解します$date_1234ところで、ファイル形式以外には、互いに関係のない100個のファイル名を変更する方法を知りたいです。

名前変更の例:

  • 以前の名前であるalpha.aiがomega.aiに名前が変更されました。
  • 以前の名前Pie32.aiがapple.aiに変更されました。
  • 以前の名前はxmas.aiで、名前はsanta.aiに変更されました。

最初は、bashスクリプトを使用してすべての名前を.csvファイルに抽出し、それを列Aに入れました。 BI列に新しい名前を書き込みます。では、一般的なイベントは発生しませんsed

#!/bin/bash
for i in *.ai
do
        mv $i $(echo $i | sed "a1,b1")

done

答え1

次のファイルがある場合:

old_name1, new_name1
old_name2, new_name2
old_name3, new_name3

汚い小さなトリックをすることができます。

sed 's/^/mv -vi "/;s/, /" "/;s/$/";/' < names.csv | bash -

sed コマンド (セミコロンで区切られます) は、次のことを行います (置換のsため/に区切り文字として別​​の文字を使用することができ、@よく使用されます)。

  • s/^/mv -vi "/mv -vi "-各行の先頭に追加します(^行の先頭)。
  • s/, /" "/- カンマの後にスペースが続くこと" "。に変更します。
  • s/$/";/- すべての行に二重引用符を追加します($行の終わりを示します)。

したがって、出力はsed次のようになります。

mv -vi "old_name1" "new_name1"
mv -vi "old_name2" "new_name2"
mv -vi "old_name3" "new_name3"

処刑される予定ですbash。ファイル名の周りの引用符は必須ではなく、ファイル名から可能なすべてのスペースを保護するだけです(ただし、カンマの後のスペースは区切り文字として使用されるため、それは役に立ちません)。何が間違っているか、何が起こっているのかを知っていることを示している指示は、すでに-v存在しているファイルを上書きするように求められます。mv-i

答え2

スクリプトにはいくつかの参照問題があります。特殊文字(スペース、\[?*-

**変数の置換とコマンドの置換"$i"には常に二重引用符を使用してください"$(sed …)".。二重引用符がない場合、変数の値はスペースで区切られたワイルドカードパターンのリストとして解釈され、各パターンは一致するファイル名のリストに置き換えられます(一致項目がない場合、パターンは変更されません)。

また、ファイル名がで始まる場合は-オプションとして解釈され、mvオプションとして解釈されることもありますecho。最初に渡すと、--コマンドにオプションがなくなったことが通知されます。

for i in *.ai; do
  mv -- "$i" "$(printf '%s\n' "$i" | sed 's,a1,b1,')"
done

sed(これはまだファイル名に改行文字が含まれていないと仮定します。)(また、パラメータをあなたの意図したとおりに修正しました。)


ファイル名のリストが引用符なしでカンマで区切られている場合は、シェルスクリプトを使用して解析できます。これは、ファイル名にカンマや改行文字がないと仮定します。

while IFS=, read -r from to junk; do
  mv -- "$from" "$to"
done <"$files_to_rename.csv"

入力ファイルが参照できるCSVファイルの場合は、実際のCSVパーサーを使用してください。自分で実行しようとしないでください。バラよりcsvファイルを処理する強力なコマンドラインツールはありますか?たとえば、Python(標準入力でCSVを使用)は次のようになります。

import csv, os, sys
for line in csv.reader(sys.stdin):
    (source, dest) = line
    os.rename(source, dest)

答え3

ファイルに興味深い文字('、、、、)がある場合は、ファイルを繰り返し bash 配列として読み取ることができます"\$

while IFS=, read -r -a arr; do mv "${arr[@]}"; done <files.csv 

答え4

この種の問題に直面したとき、私は通常手動のsed / bashトリックを使用します。

  1. csvファイルを読み取り、「mv file1 file2」形式の行を書き込むエディタマクロまたは愚かな小さなプログラムを作成する必要があります。
  2. 次にスクリプト(またはマクロ)を実行し、出力をrun-my-cmds.shに保存します。
  3. run-my-cmds.shを視覚的にチェックして正しいことを確認してください。
  4. bashは私のcmds.shを実行します。

関連情報