正規表現を使用したバッチコピーと名前変更

正規表現を使用したバッチコピーと名前変更

スクリプトを書かずに複数のファイルをコピーして名前を変更する方法があるかどうか疑問に思います。このような名前のファイルがいくつかあり、コピー名が次のように指定prefix_12345678901_12345678901_suffix.extされるように、そのファイルをすべて指定されたディレクトリにコピーする必要があります。1234567890_1234567890.ext

また、ターゲットディレクトリの既存のファイルを上書きしたくありません。

私は次のことができることを知っています。

cp -n source/*.ext target

続いて

rename 's/.*([0-9]{11}_[0-9]{11}).*\.(.*$)/$1.$2/' *.ext

ただし、これは最初にファイルをコピーしてから、ファイルがすでに存在することを確認します。逆過程が必要なのに…

編集する:

さて、これはスクリプトのようですが、ついに成功しました。

for i in /source/*.ext; do if [[ "$i" =~ [0-9]{11}_[0-9]{11} ]]; then cp $i /target/${BASH_REMATCH[0]}.ext; fi done;

答え1

pax一度にコピーして名前を変更できます。

pax -rw -pp -k \
    -s'!^source/[^/]*\([0-9]\{11\}_[0-9]\{11\}\)[^/]*\(\.[^./]*\)!\1\2!' \
    -s'!.*!!' source target

pax -rwファイルをコピーします。-pp権限を維持し、-k既存のファイルを上書きしないようにします。この-sパラメータは、paxにコピーするときにファイル名を変更するように指示します。最初の変換では、目的の名前を変更します(使用基本正規表現そして交換はこんな感じed)。 2番目の変換は、まだ一致していない各ソースファイル名を空の文字列に変換し、paxにファイルをコピーしないように指示します。

zshファンのための注意:私が知っている限り、zmv他のファイルに関係なく定義が存在しないファイルをコピーすることはできません。

関連情報