web-dev-qa-db-ja.com

ファイルがすでに存在する場合にのみ、ファイルをコピー先フォルダーにコピーします。ただし、ソースファイルのファイル拡張子は異なります

ファイルがすでに存在する場合にのみ、ファイルをコピー先フォルダーにコピーします。ただし、ソースファイルのファイル拡張子は異なります。

つまり、拡張子が「。desktop.in」のファイルのバックアップがあり、ファイル拡張子が「。desktop」でファイルのみのコピー先にコピーしたい宛先にすでに存在します。

ソースフォルダに含まれるもの:

  • a.desktop.in
  • b.desktop.in
  • c.desktop.in

宛先フォルダーに含まれるもの:

  • a。デスクトップ
  • b。デスクトップ

a.desktopおよびb.desktopファイルのみを上書きしたい

これを試しました:

for file in /destination/*.desktop;do cp /src/"${file##*/}".in "$file";done

しかし、それはそのタスクに最適化されているようには見えません。

あなたはそれをするより良い方法を知っていますか?

2
Paul

2つの方法が見つかりました:

for file in /src/*.desktop.in; do
  file=${file%.in}
  if test -e "/dest/$(basename ${file})"
    then cp "/src/${file}.in" "/dest/${file}"
  fi
done

rsyncと--existing:

for file in /src/*.desktop.in; do 
  rsync --dry-run --existing --verbose "/src/${file}" "/dest/${file%.in}"
done
0
Paul
for file in /destination/*.desktop; do echo cp "/src/${file##*/}.in" "$file"; done

すべてが良好に見える場合は、echoを削除します。

1
Cyrus

あなたが持っているものは基本的にそれが得るのと同じくらい良いです。

ファイルを列挙しているディレクトリに移動することで、ファイル名の操作を少し節約できます。パフォーマンスではなく、読みやすさの問題です。

set -e
cd /destination
for file in *.desktop; do
  cp "/src/$file.in" "$file"
done

失敗をチェックすることを忘れないでください。