
2 つのレベルのサブフォルダーがあるフォルダーがあります。 2番目のサブフォルダにはjpgファイルがあります。すべてのjpgの名前は同じです。cover.jpg
例:
/home/user/folder001/folderAAA/cover.jpg
/home/user/folder002/folderBBB/cover.jpg
[...]
/home/user/folder999/folderZZZ/cover.jpg
すべてのファイルを見つけて新しいフォルダにコピーし、cover.jpg
名前を変更して、最初と2番目のサブフォルダの名前をファイル名にプレフィックスとして追加する必要があります。
例:
予想操作後の ot の内容は、次/home/user1/newfolder
のようになります。
folder001_folderAAA_cover.jpg
folder002_folderBBB_cover.jpg
[...]
folder999_folderZZZ_cover.jpg
答え1
これはsedコマンドを使用して簡単に達成できます。名前を変更する必要があるファイルのリストを探し、sed / echoファイルパスを使用して要件を満たします。
cd /home/user
for fl_nm in $(find . -type f -name "cover.jpg")
do
echo copying the file with desired name to new folder : $fl_nm
cp $fl_nm /home/user1/newfolder/$(echo ${i#*/*} | sed 's/\//_/g')
#Above copy command ignores the find result which extracts only file path from ./**file_path**
done
Cover.jpgという名前のすべてのファイルは、ファイル名にそのフォルダの詳細を含む/home/user1/newfolderにコピーされます。
答え2
#! /bin/bash
target_dir_path="/copy/here"
for file in folder*/*/*.jpg; do
l1="${file%%/*}"
l2="${file#*/}"
l2="${l2%%/*}"
filename="${file##*/}"
target_file_name="${l1}_${l2}_${filename}"
echo cp "$file" "${target_dir_path}/${target_file_name}"
done
echo
要件を満たしている場合は削除してください。
答え3
zshで次のように入力します。autoload zmv
あなたのもの.zshrc
(または実験するには、コマンドラインからこのコマンドを実行してください):
mkdir /home/user1/newfolder
zmv '/home/user/(*)/(*)/(cover.jpg)' '/home/user1/newfolder/${1}_${2}_${3}'
左側のパターンに一致する各ファイルの名前は、右側の代替テキストに変更されます。*
「すべての文字シーケンス」を意味します。右側で、および${1}
は${2}
、${3}
それぞれパターンの最初、2番目、3番目の角かっこグループに一致するソースパス部分に置き換えられます。
明示的なグループ化を使用する代わりに、各ワイルドカードが自動的に独自のグループになるように要求できます。
zmv -w '/home/user/*/*/cover.jpg' '/home/user1/newfolder/${1}_${2}_cover.jpg'
でも:
zmv -W '/home/user/*/*/cover.jpg' '/home/user1/newfolder/*_*_cover.jpg'
一部は次のように付け加えることもあります。
alias zmmv='noglob zmv -W'
そこに行って~/.zshrc
書いてください:
zmmv /home/user/*/*/cover.jpg /home/user1/newfolder/*_*_cover.jpg