私の親フォルダには、次のような構造があり、特定のループを作成しようとしているフォルダがいくつかあります。
parentfolder/folder01/subfolder/map.png
parentfolder/folder02/subfolder/map.png
parentfolder/folder03/subfolder/map.png
parentfolder/folder04/subfolder/map.png
など...
したがって、各サブフォルダには名前付きファイルが含まれますmap.png
(つまり、すべてのサブフォルダのファイルは同じ名前ですが、ファイルは異なります)。
各ファイルをコピーして親フォルダ全体に入れたいのですが、map.png
同時に「サブフォルダ」の上のフォルダに基づいてコピーの名前を変更したいと思います。
たとえば、名前を変更しながら親フォルダにコピーしたいとします。map.png
その後、ループを使用して他のすべてのフォルダに対して同じことを行います。parentfolder/folder01/subfolder
folder01.png
私は同様のことを試しましたが、明らかに私が望むことをするために苦労しています。
for i in parentfolder/*; do
cd $i
cd subfolder
cp map.png ../../"$i".png
cd -
done
私はまだ初心者であり、これについて非常に新しいものなので、助けてくれてありがとう。とても感謝しています。
答え1
以下のようにforループを試してみてください。
for d in parentfolder/* ; do
cp "$d/subfolder/map.png" "$d.png"
done
現在のディレクトリがparentfolder
。
答え2
Zshにはユーティリティが付属しています。zmv
これは、パターンベースのファイルの名前変更とコピーに役立ちます。.zshrc
まだ入力していない場合は、次の項目に入力してください。
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
(またはシェルセッションでこのコマンドを実行して、このセッションでのみアクティブにすることができます。)
次に(からparentfolder
):
zcp '(*)/subfolder/map.png' '$1.png'
最初のパラメータは置き換えるパターンです。 2番目のパラメータは代替名です。代わりに、、$1
など$2
はパターン内の対応するブラケットグループを表します。その他の可能性と制限については、マニュアルを参照してください。