14571


UNIX環境でシェルスクリプトを使って，以下のようにディレクトリ名を一括で変更するにはどうすればいいのでしょうか？

変更前:

  * a12456
  * b12459
  * e12461
  * u12467

変更後:

  * 12456
  * 12459
  * 12461
  * 12467


CC BY-SA 3.0
2015-08-18T05:16:22.870
14569
2015-08-22T13:11:17.803
2015-08-22T12:51:57.517
3061
10862
question
sh shellscript
シェルスクリプトで各ディレクトリ名の頭文字を一文字消すには


提示例の行頭 - は真のファイル名にはあるのでしょうか、それとも列挙の意図でつけた文字で実際には無し？  
先頭の１文字を削除するのであれば

[code]

    for i in *; do if [ -d $i ]; then mv -f $i `echo $i | sed -e s/^.//`; fi; done
    
[/code]

とか。  
３文字目を削除するならそのように直すと良いです。

ディレクトリ `abcd` と `bcd` が両方あるときどうなるべきかは事前に考察が必要っす。


CC BY-SA 3.0
2015-08-18T05:31:23.433
14570
2015-08-18T05:31:23.433
8589
14569
answer


bash でよければ、

[code]

    $ for f in *; do mv "$f" "${f:1}"; done
    
[/code]

です。`for f in *` としていますので、カレントディレクトリにある `.` で始まるファイル以外の全てのファイルが対象になりますのでご注意下さい。


CC BY-SA 3.0
2015-08-18T05:31:43.957
14571
2015-08-18T05:31:43.957
14569
answer


大喜利みたいですが こういうのも思いつきました。  
利点は名前を展開しないのでディレクトリがたくさん有ってもエラーになりません。

[code]

    $ ls -1 | sed 's/^.\(.*\)$/mv \0 \1/' | sh
    
[/code]


CC BY-SA 3.0
2015-08-18T10:23:58.733
14584
2015-08-18T10:23:58.733
5008
14569
answer


外部コマンドは不要です。bash, ksh, zsh 依存の `${var:offset}` なしでも POSIX sh の構文だけで実現可能です。

[code]

    $ for d in [a-z]*; do [ -d "$d" ] && mv -- "$d" "${d#?}"; done
    
[/code]


CC BY-SA 3.0
2015-08-22T12:41:27.090
14733
2015-08-22T13:11:17.803
2015-08-22T13:11:17.803
3061
3061
14569
answer