スクリプトを書かずに複数のファイルをコピーして名前を変更する方法があるかどうか疑問に思います。このような名前のファイルがいくつかあり、コピー名が次のように指定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
他のファイルに関係なく定義が存在しないファイルをコピーすることはできません。