0

私は次のようなディレクトリをたくさん持っています

2013_03_12_18_26_am
2013_03_12_18_26_cu
2013_03_12_18_26_ig
2013_03_12_18_26_mdf
2013_03_12_18_26_pih
2013_03_12_18_26_tn
2013_03_12_18_26_an
2013_03_12_18_26_cv
2013_03_12_18_26_ik
2013_03_12_18_26_mhr
2013_03_12_18_26_pnb    
2013_03_12_18_26_to

私がやりたいのは、最後の2文字に名前を変更することです。例:2013_03_12_18_26_am to am、これは1つずつ実行できますmv 2013_03_12_18_26_am amが、時間がかかります。これはシェルスクリプトに準拠できますか?

最後の「_」以降のすべてを新しいディレクトリの名前にします。

4

5 に答える 5

3

これらのdir-nameにはスペースやその他の特殊文字がないことに気づきました。だからあなたは試すことができます:

ls|xargs -n1 |sed -r 's/(.*_)(.*)/mv & \2/'

mvcmdを出力します。すべてのコマンドが正しいと思う場合は、それをにパイプするだけです|sh

lsこれらのdirのみを取得するように変更できる部分に注意してください。

于 2013-03-21T16:57:31.333 に答える
2

上記の形式に従うすべてのディレクトリの場合、bashでは、次の変数置換を使用して、最後の文字の後に文字を抽出できます。_

var=2013_03_12_18_26_am
echo ${var##*_} #am

次に、フォルダ内のすべてのディレクトリの名前を次のように変更できます。

for dir in *_*; do #as there may be more than 2 chars after final _
    new_dir=${dir##*_}
    mv $dir $new_dir
done

もちろん、ディレクトリを移動しているだけで、何も上書きしていないことを確認するためのチェックを追加することをお勧めします。

于 2013-03-21T16:56:12.527 に答える
1
 for d in *_??
 do
     newd=$(expr $d : '.*_\([a-z][a-z]*\)')
     mv $d $newd
 done
于 2013-03-21T16:56:22.153 に答える
1

これは、すべての(そしてすべての)フォルダが1つのディレクトリにあることを前提としています。ので注意してください...

オリジナル:

marks-mac-pro:test mstanislav$ ls
2013_03_12_18_26_am 2013_03_12_18_26_an 2013_03_12_18_26_cu 2013_03_12_18_26_cv     2013_03_12_18_26_ig 2013_03_12_18_26_ik 2013_03_12_18_26_mdf    2013_03_12_18_26_mhr    2013_03_12_18_26_pih    2013_03_12_18_26_pnb    2013_03_12_18_26_tn 2013_03_12_18_26_to

シェルスクリプト:

marks-mac-pro:test mstanislav$ for i in `ls .`; do NEW=`echo $i | cut -d_ -f6`; mv $i $NEW; done

結果:

marks-mac-pro:test mstanislav$ ls
am  an  cu  cv  ig  ik  mdf mhr pih pnb tn  to

念のため、実際のデータで実行する前にこれをテストしてください。繰り返しになりますが、これは、名前を変更するフォルダーだけが含まれるディレクトリでのみ行うか、 lsの最初の部分を より具体的に書き直してください。

于 2013-03-21T16:58:45.283 に答える
0

このための名前変更コマンドが気に入っています。これにより、次のように perl 正規表現が可能になります。

rename 's/.*([a-z]{2})$/$1/' *
于 2013-03-21T17:21:48.013 に答える