ファイル名にパスの一部を追加してファイルを見つけて名前を変更します。

ファイル名にパスの一部を追加してファイルを見つけて名前を変更します。

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

関連情報