Linuxファイルサーバー(RedHat Enterprise)には、クライアントが動作する名前を変更する必要のあるフォルダーがいくつかあります。古いフォルダ形式(変更が必要なもの)はでしたclientcode_jobnumberjobname
。新しい形式はclientcode_jobnumber_jobname
です。jobnumber
基本的に、との間のフォルダ名に余分なアンダースコアを追加して、古いフォルダ名を変更する必要がありますjobname
。また、新しい形式で表示するために作成されているすべての新しいフォルダー構造があるため、これらを変更する必要はありません。ジョブ番号は常に1文字の後に4つの数字が続きます。クライアントコードは、クライアントに応じて3〜4文字です。ジョブ名はジョブごとに異なります。フォルダーはすべて次の場所にありますclients/clientname/jobs/clientcode/"folder that needs to be renamed"
(スクリプトが構造に深く入り込む必要がある例にすぎません)。それぞれに対してこれを行う必要がありますclientcode
各クライアントの下。これを行うためのスクリプトをどのように設定しますか?どんな助けでも大いに評価されるでしょう。これらのフォルダには、名前を変更する必要があるものが何千もあります。
5 に答える
ファイル名に対して sed のように機能するコマンドがいくつかあります。試してみてください (または、 RHEL では見つからない可能性がある、別名 prename または rename.PLmmv
の perl バリアント)。rename
おまけとして、どちらにも-n
オプション (何もしない) があるため、何をしようとしているかを確認して、物を壊したり、情報を失ったりしないようにすることができます。
find /path/clients -type d -name "*_?[0-9][0-9][0-9][0-9]*" | while IFS= read -r DIR
do
dir=${DIR##*/}
base=${DIR%/*}
IFS="_"
set -- $dir
front=$1
back=$2
jobname=${back#?????}
jobnum=${back%$jobname}
newname="${front}_${jobnum}_${jobname}"
echo mv "$DIR" "$base/$newname"
done
for entry in * ; do
if [ ! -d "$entry" ] ; then
continue
fi
jobname="${entry##*_?????}"
dirbase="${entry%$jobname}"
if [ -z "$dirbase" -o -z "$jobname" ] ; then
echo "Error with '$entry'"
continue
fi
mv "$entry" "${dirbase}_$jobname"
done
おそらくそれは私だけですが、ディレクトリ構造がどのように見えるかを正確に理解していません.コードタグ内の例を教えてください.
そして、おそらくこれはserverfault.comにあるはずです(ただし、#!/bin/shスクリプトはプログラミングとしてカウントされると思います)
追記:ヌーファル・イブラヒム、抵抗?それは、すべての POSIX 準拠バージョン、または Linux で機能する方法を使用することです。おそらく古いですが、私が持っている Solaris マシンには含まれていませrename
んmmv
。したがって、そのような解決策は不可能です。
名前の形式は高度に構造化されており、すべてが単一の親の下にあると言われているため(直接または間接の子として..あなたが言及したことからはわかりません)、私はこれをお勧めします:
フォルダ名の正規表現を作成し、正規表現に対してターゲット フォルダ (名前を変更するフォルダがあるフォルダ) の内容の名前と一致する小さな perl スクリプトを記述します。一致したら、フォルダーの名前を新しい名前に変更します。Perl はこれらすべてを簡単にします。
このアプローチを追求することに決めた場合、念のため、Perl を知らず、どこから始めればよいか迷っている場合に備えて、途中で学習することに興味がある場合は、「Minimal Perl」という本を一読することをお勧めします。 ..巨大な言語を学習し、それを今必要なものに似たものに使用するための迅速で興味深い方法。
お役に立てれば。