4つのフォルダーf1, f2, f3 and f4
を持つメインディレクトリがあります。これらのフォルダーにはそれぞれ10個のフォルダーがあり、これらの10個のフォルダーff1...ff10
にはそれぞれ.jpeg
などの名前のimage1
イメージがあります。私が知りたいのは、各f1, f2, f3 and f4
の10個のフォルダのこれらの各フォルダにあるこれらの.jpeg画像の名前を変更する方法です。したがって、image1.jpeg
がf3/ff1
にあるなど、名前の先頭に親フォルダを連結しますその名前はf3_ff1_image1.jpeg
になり、4つのメインフォルダーのそれぞれの他の10個のフォルダーにある他のすべての画像と同じになります。誰かが.sh
ファイルでこれを行う方法をアドバイスしてください。
次のように、単純なファイルchangeName.sh
を作成します。
#!/bin/bash
fileName=$(basename $1)
filepath=$(dirname $1)
secondDir=$(basename $filepath)
firstDir=$(basename $(dirname $filepath))
parentDir=$(basename $(dirname $(dirname $filepath)))
mv $1 $filepath/${parentDir}_${firstDir}_${secondDir}_$fileName
/home/yourUser/bin
などに保存します。
許可をchangeName.sh
に変更します:
chmod +x /home/yourUser/bin/changeName.sh
/home/yourUser/.bashrc
ファイルを開き、最後に次の行を追加します。
PATH=$PATH:/home/yourUser/bin
保存してリロードします。
source .bashrc
これで、フォルダを名前の一部として使用して名前をファイルに変更できる新しいユーティリティができました。
これを試して:
find mainDirectory -name "*.jpeg" -exec changeName.sh {} \;
mainDirectory
は、絶対または相対です。
Lubuntu 12.04でテスト済み
dirname ファイル名から最後のコンポーネントを削除します basename ファイル名からディレクトリとサフィックスを取り除きます。
したがって、ディレクトリの第3レベルを取得するには:
parentDir=$(basename $(dirname $(dirname $filepath)))
ループといくつかのbash文字列操作
while read -rd $'\0' f; do
d="${f%/*}"; p="${d/\//_}";
echo mv -- "$f" "${d}/${p}_${f##*/}"
done < <(find -type f -name '*.jpeg' -printf '%P\0')
(ファイルと正しく一致することを確認したら、echo
を削除します)
Perlベースのrename
コマンドとbash globstar
を使用
shopt -s globstar
rename -nv -- 's|(f\d+)/(ff\d+)/(image\d+)|$1/$2/$1_$2_$3|' **/*.jpeg
(-nv
ファイルと正しく一致することを確認したら)