名前を変更したいファイルがたくさんあります。各ファイル名には数字(xxx)が含まれていますFIXED_PART_xxx_UNIQUE_PART
。
また、各行に数字と文字列を含むテキストファイルがあります。
001 string001
002 string002
...
112 string112
各ファイルには項目がありますが、必ずしも各項目にファイルがあるわけではありません。その部分を解析し、ファイルの文字列に置き換えてxxx
各ファイルの名前を変更したいと思います。
最良のアプローチは何ですか?
編集:実際のファイル名は次のとおりです。
Berlin_Ost_034_some_variable_text.jpg
したがって、この場合、固定部分には下線が含まれていますが、すべてのフォルダに対して同じです。 xxx 部分は数字のみで構成されます。
出力はファイルの
Berlin_Ost_Sommer_some_variable_text.jpg
200個のファイルについて話しています。
テキストファイルには034 Sommerという1行が含まれています。
これがファイルの034部分がSommerに置き換えられた理由です。
ファイルにはさまざまな文字列が含まれていますが、文字、数字、ドイツ語の発音区別記号のみが含まれています。最初の部分は常に数値です。これは私が使用しているファイルの1つの一部です。
033 Winter
034 Sommer
035 Herbst
036 Frühling
037 Abends.kurz.vor.Sonnenaufgang
私はLinuxを使用しています。
ベストアンサー1
zsh
文字列にスペースやタブがないとします。
autoload -Uz zmv
typeset -A mapping=($(<mapping.txt))
zmv -n '(*_)([0-9](#c3))(_*.jpg)' '$1${mapping[$2]-$2}$3'
満足すれば削除-n
(テスト実行)します。
複数の下線の間に一連の3桁の数字を含むファイル名の場合、一番右の数字が置き換えられます。これを使用すると、${mapping[$2]-$2}
地図上の数値シーケンスが見つからない場合は変更されません。
すべてのファイルの接頭辞が同じ場合は、次のこともできます。
zmv -n '(Berlin_Ost_)([0-9](#c3))(_*.jpg)' '$1${mapping[$2]-$2}$3'
文字列にスペースまたはスペース(最初または末尾を除く)を含めることができる場合は、次のように連想配列を作成できます。
typeset -A mapping
while read -r key value; do mapping[$key]=$value; done < mapping.txt
代わりに。
ファイル名の3桁の数字をすべて変更するには、次のようにします。
zmv -n '*.jpg' '${f//(#m)[0-9](#c3)/${mapping[$MATCH]-$MATCH}'
この場合、両側でアンダースコアは見つかりません。私たちはできます:
zmv -n '*.jpg' '${f//(#b)_([0-9](#c3))_/${mapping[$match[1]]-$match[1]}'
しかし、これは001
andを置き換えますが、2番目002
は最初のゲームに含まれており、後のゲームの一部になることができないためfoo_001_bar_002_baz.jpg
表示されません。foo_001_002_bar.jpg
_