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のディレクトリ(〜)があるため、XYZ50name
1つのスクリプトを使用して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
。