フォルダ構造は次のとおりです。
/ホーム/ユーザー/写真/休暇/イタリア/ローマ/写真。フロント.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なので内容を上書きします)。