ディレクトリ名に基づいてディレクトリのファイル名を変更する

ディレクトリ名に基づいてディレクトリのファイル名を変更する

Linux、SSHのディレクトリ名に基づいて複数のファイルの名前を変更しようとしています。

というディレクトリがありますXYZ01smith。という名前のファイルが4つありますsmith_5*。このファイルにプレフィックスを追加する必要がありますXYZ01
しかし、、次のディレクトリはですXYZ02perry。名前は4つです。このファイルにプレフィックスを追加するperry_3*必要があります。XYZ02

各ディレクトリに対してこれを行うループがあります。

for i in smith_5*;
    do mv ${i} XYZ01${i};
done 

XYZ01nameただし、50のディレクトリ(〜)があるため、XYZ50name1つのスクリプトを使用して50のすべてのディレクトリを処理できることをお勧めします。これが可能でなければならないと確信していますが、実装方法がわかりません。

答え1

そしてzsh

autoload zmv # best in ~/.zshrc
zmv '(XYZ??)(*)/(*)' '$1$2/$1$3'

答え2

そしてbash

for f in XYZ*/*; do mv -v "$f" "${f%/*}/${f:0:5}${f##*/}"; done

forすべてのディレクトリを繰り返しますXYZ*。これにより、コマンドmvはファイルの名前を変更します。

どこ:

  • $f元のファイル名
  • ${f%/*}ディレクトリ名
  • ${f:0:5}プレフィックスです
  • ${f##*/}元のファイル名

答え3

このコマンドを実行すると、実行するアクションが表示されます。

ls -d XYZ*/* |
sed -n s'|\(XYZ[0-9][0-9]\)\([^/]*\)/\(\2_.*\)|mv & \1\2/\1\3|p' |
cat

コマンドを実行するには、catに置き換えますsh

関連情報