回答:
このようにシンプル。
(bash)
for i in * ; do mv -- "$i" "${i:0:5}" ; done
出来上がり。
Advanced Bash-Scripting Guide(第10章変数の操作)からの説明(NOTEそのマニュアルのエラーを強調するためのインラインs を追加):
部分文字列の抽出
${string:position}
から部分文字列を抽出
$string
し$position
ます。場合は
$string
、パラメータは「*」や「@」で、この抽出物の位置パラメータは、から始まります$position
。${string:position:length}
$length
から部分文字列の文字を抽出$string
し$position
ます。
NOTEパラメータ展開の周りに引用符がありません! echo
任意のデータには使用しないでください。
stringZ=abcABC123ABCabc
# 0123456789.....
# 0-based indexing.
echo ${stringZ:0} # abcABC123ABCabc
echo ${stringZ:1} # bcABC123ABCabc
echo ${stringZ:7} # 23ABCabc
echo ${stringZ:7:3} # 23A
# Three characters of substring.
# Is it possible to index from the right end of the string?
echo ${stringZ:-4} # abcABC123ABCabc
# Defaults to full string, as in ${parameter:-default}.
# However . . .
echo ${stringZ:(-4)} # Cabc
echo ${stringZ: -4} # Cabc
# Now, it works.
# Parentheses or added space "escape" the position parameter.
位置と長さの引数であることを「パラメータ」することができるが、変数としてではなく、数値定数として表されます。
もし
$string
パラメーターが「*」または「@」、この抽出物の最大である$length
位置パラメータ、始まります$position
。
echo ${*:2} # Echoes second and following positional parameters.
echo ${@:2} # Same as above.
echo ${*:2:3} # Echoes three positional parameters, starting at second.
NOTE:expr substr
はGNU拡張機能です。
expr substr $string $position $length
$length
から$string
始まる文字を抽出し$position
ます。
stringZ=abcABC123ABCabc
# 123456789......
# 1-based indexing.
echo `expr substr $stringZ 1 2` # ab
echo `expr substr $stringZ 4 3` # ABC
NOTE:これecho
は冗長であり、信頼性がさらに低下します。を使用しexpr substr + "$string1" 1 2
ます。
NOTE:expr
出力が0(または-0、00 ...)の場合、ゼロ以外の終了ステータスで戻ります。
ところで。この本は、Ubuntuの公式リポジトリにとして存在していますabs-guide
。
${var:1}
値を返しますvar
。
POSIXではsh
、
"${var%?????}"
され$var
、最後の5つの末尾の文字を剥奪(または$var
場合は$var
5文字未満含まれています)
"${var%"${var#??????????}"}"
はの最初の10文字です$var
。
"${var%_*}"
(-> )の末尾で$var
一致する最短文字列が削除されます。_*
$var
foo_bar_baz
foo_bar
"${var%%_*}"
:同じですが、最短一致ではなく最長一致(foo_bar_baz
-> foo
)。foo_bar_
:を取得したい場合"${var%"${var##*_}"}"
(${var##pattern}
と同じですが、終了${var%%pattern}
では$var
なく開始でパターンを探します)。でzsh
:
$var[1,-6]
最後から6番目までの最初の文字(最後の5つを除くすべて)。$var[1,10]
最初の10文字。あるいは:ksh
bash
zsh
"${var:0:10}"
:最初の10文字 $var
bash
かzsh
:
"${var:0:-5}"
:最後の5文字を除くすべて($var
設定されている場合にエラーが発生し、スクリプトが終了しますが、5文字未満の場合、また$var
が設定されていない場合zsh
)。Bourneとのsh
互換性が必要な場合、確実に実行することは非常に困難です。結果が改行文字で終わらないことを保証できる場合は、次のことができます:
first_10=`expr " $var" : ' \(.{1,10\}\)'` # beware the exit status
# may be non-zero if the
# result is 0 or 0000000000
all_but_last_5=`expr " $var" : ' \(.*\).\{5\}'`
$var
(システム間で変化する)の長さにも制限があります。
これらすべてのソリューションで、$var
有効な文字の一部を形成できないバイトが含まれている場合、YMMV。
まずfor
、ファイル名にループを使用しないでください。
次に、このような何かが役立つはずです。
find ./ -type f | while read filename ;do
newfilename=$(echo ${filename}|cut -c 1-10)
mv ${filename} ${newfilename}
done
for
ファイル名で使用するのが悪いのはなぜですか?
printf
より安全にするために使用します。...およびread -r
。
for
ループは多分行方不明を除いて大丈夫だった--
。4行のコードに少なくとも10個のバグがあります。単一行、使用エコー、不足している引用符のファイル名をしていると仮定のようなよく知られた悪い習慣その多く
bash
求めているのにタグが必要なのはなぜsh
ですか?