ファイルがすでに存在する場合にのみ、ターゲットフォルダにコピーします。しかし、ソースファイルのファイル拡張子は異なります。

ファイルがすでに存在する場合にのみ、ターゲットフォルダにコピーします。しかし、ソースファイルのファイル拡張子は異なります。

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

つまり、いくつかのファイルのバックアップがあります。」.desktop.in「拡張子、ファイル拡張子がある場所にコピーしたい」。デスクトップで、ターゲットにすでに存在するファイルのみが含まれます。

ソースフォルダには次のものが含まれます。

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

ターゲットフォルダには次のものが含まれます。

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

ただ覆いたいa.デスクトップそしてb.デスクトップ文書

これを試しました:

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

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

より良い方法を知っていますか?

答え1

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

問題がなければ削除してくださいecho

答え2

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

列挙されたファイルのディレクトリに変更して、いくつかのファイル名操作を保存できます。これはパフォーマンスの問題ではなく、可読性の問題です。

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

誤動作を確認することを忘れないでください。

答え3

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と--既存:

for file in /src/*.desktop.in; do 
  rsync --dry-run --existing --verbose "/src/${file}" "/dest/${file%.in}"
done

関連情報