web-dev-qa-db-ja.com

サブフォルダー内のファイルの名前を親フォルダー名に変更します

4つのフォルダーf1, f2, f3 and f4を持つメインディレクトリがあります。これらのフォルダーにはそれぞれ10個のフォルダーがあり、これらの10個のフォルダーff1...ff10にはそれぞれ.jpegなどの名前のimage1イメージがあります。私が知りたいのは、各f1, f2, f3 and f4の10個のフォルダのこれらの各フォルダにあるこれらの.jpeg画像の名前を変更する方法です。したがって、image1.jpegf3/ff1にあるなど、名前の先頭に親フォルダを連結しますその名前はf3_ff1_image1.jpegになり、4つのメインフォルダーのそれぞれの他の10個のフォルダーにある他のすべての画像と同じになります。誰かが.shファイルでこれを行う方法をアドバイスしてください。

1
Tak

次のように、単純なファイル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)))
2
Lety

ループといくつかの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ファイルと正しく一致することを確認したら)

5
steeldriver