ファイル拡張子を維持しながら、ディレクトリのファイル名をそのディレクトリ名に変更するにはどうすればよいですか?

ファイル拡張子を維持しながら、ディレクトリのファイル名をそのディレクトリ名に変更するにはどうすればよいですか?

現在のディレクトリに異なる名前を持つ複数のディレクトリがあります。

Hello World/
Dr. Dre - Still Dre/
Angry Birds/
2018 Grand Prix Race Highlights/

各ディレクトリにはファイルがあります(各ディレクトリに1つずつ)。

source.c
song.aac
setup.apk
spanish.mp4

各ファイルの名前を対応するディレクトリ名に変更したいが、拡張子は変更しないでください。サンプル出力ファイル:

Hello World.c
Dr. Dre - Still Dre.aac
Angry Birds.apk
2018 Grand Prix Race Highlights.mp4

出力位置は重要ではありません。

私は現在のディレクトリでファイル名を変更する多くの解決策を見つけfor file in *ましたがmv "$file" "${file/oldname/newname}"、私のファイルは1レベルの深さのサブディレクトリにあるので、現在持っているファイルは次のようになります。

currdir=$(pwd)
for dir in */
do
  cd ${dir}
  file=$(echo *)
  ext=${file##*.}
  mv "*" "${dir}.${ext}"
  cd ${currdir}
done

私はzshを使用していますが、この機能を実行しようとすると、その行にzsh: source.c not found何か問題がある可能性があると思いますfile=$(echo *)。私は私がやっていることの複雑さが好きではないので、よりきれいな方法や線があるかもしれません。mv、、などUbuntuにデフォルトでインストールされているコマンドを使用したいと思いますfind。ディレクトリ名には、、、などの記号文字が含まれる可能性があるため、奇妙な名前も許可してください。sedvimgrep$&.

ベストアンサー1

私はこれをしたいだけです:

autoload zmv
zmv '(*)/(*)(.*)' '$1$3'

おすすめ記事