パターンで検索し、同じフォルダに別の名前でコピーします。

パターンで検索し、同じフォルダに別の名前でコピーします。

フォルダ構造は次のとおりです。

/ホーム/ユーザー/写真/休暇/イタリア/ローマ/写真。フロント.001.jpg

ローマのフォルダには他の写真もたくさんありますが、興味があるのは」フロント「ファイル名に。このファイルをコピーして名前を付ける必要があります。」ファンアート.jpg"(まだローマのフォルダにあります)。

イタリア語の親フォルダに保存されているすべてのフォルダに対してこれを行いたいと思います。

この画像を検索しようとしましたが、find別の名前を使用して複製することはできません。

この問題を解決する方法を知っていますか?

答え1

-execdirこれを使用して、ファイルがあるディレクトリに基づいてコピーを作成できます。

find Italy -name '*.front.*' -execdir cp -- {} 'fanart.jpg' \;

例: 与えられた

$ tree Italy/
Italy/
├── Florence
│   ├── photo.back.001.jpg
│   ├── photo.back.002.jpg
│   ├── photo.back.003.jpg
│   ├── photo.front.001.jpg
│   ├── photo.front.002.jpg
│   └── photo.front.003.jpg
├── Naples
│   ├── photo.back.001.jpg
│   ├── photo.back.002.jpg
│   ├── photo.back.003.jpg
│   ├── photo.front.001.jpg
│   ├── photo.front.002.jpg
│   └── photo.front.003.jpg
└── Rome
    ├── photo.back.001.jpg
    ├── photo.back.002.jpg
    ├── photo.back.003.jpg
    ├── photo.front.001.jpg
    ├── photo.front.002.jpg
    └── photo.front.003.jpg

3 directories, 18 files

それから

$ find Italy -name '*.front.*' -execdir cp -v -- {} 'fanart.jpg' \;
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’
‘./photo.front.001.jpg’ -> ‘fanart.jpg’
‘./photo.front.003.jpg’ -> ‘fanart.jpg’
‘./photo.front.002.jpg’ -> ‘fanart.jpg’

(このパターンに一致するファイルが複数ある場合は、コピーが連続して上書き*.front.*されます。目的のものではない場合、または-nを追加してください--no-clobber。)

$ tree Italy/
Italy/
├── Florence
│   ├── fanart.jpg
│   ├── photo.back.001.jpg
│   ├── photo.back.002.jpg
│   ├── photo.back.003.jpg
│   ├── photo.front.001.jpg
│   ├── photo.front.002.jpg
│   └── photo.front.003.jpg
├── Naples
│   ├── fanart.jpg
│   ├── photo.back.001.jpg
│   ├── photo.back.002.jpg
│   ├── photo.back.003.jpg
│   ├── photo.front.001.jpg
│   ├── photo.front.002.jpg
│   └── photo.front.003.jpg
└── Rome
    ├── fanart.jpg
    ├── photo.back.001.jpg
    ├── photo.back.002.jpg
    ├── photo.back.003.jpg
    ├── photo.front.001.jpg
    ├── photo.front.002.jpg
    └── photo.front.003.jpg

システムバージョンが回避策をfindサポートしていない場合は、フルパス名-execdirのファイル名部分を削除し(フォームのPOSIXパラメータ拡張を使用するなど"${var%/*}")、小さなインラインシェルコマンドから新しい名前に置き換えることができます。sh -c

find Italy -name '*.front.*' -exec sh -c 'cp -v -- "$1" "${1%/*}/fanart.jpg"' sh {} \;

答え2

使用要件がありますかfind?似たようなことはループがより適していると思います。

$ cd /home/user/Pictures/Vacation/Italy
$ for directory in *; do \
    cd "$directory" && \
    for file in *front*; do \
        cp --force "$file" fanart.jpg; \
    done; \
    cd /home/user/Pictures/Vacation/Italy; \
  done

本質的に、これは "Italy"のサブディレクトリを繰り返し、各サブディレクトリの名前に "Front"を含むファイルを "fanart.jpg"というファイルにコピーします(ターゲットファイル名はChangelessなので内容を上書きします)。

関連情報