次の命名規則に従う長いフォルダのリストがあります。
ABS1789_2563-01
ABS1789_2563-02
ABS1789_2563-02
.
.
.
bashを使用してABSと1789の間に「-」を追加してから、1789と2563の間に「_」を「-」に変更するにはどうすればよいですか?
答え1
IFS="\n" # Handle files with spaces in the names
for file in ABS*; do
newfile="${file/ABS/ABS-}" # Add the hyphen following ABS
newfile="${newfile/_/-}" # Change the underscore to a hyphen
mv "$file" "$newfile" # Make the change
done
以下のTonyのコメントに基づいて、より一般的なバージョンは次のようになります。
IFS="\n" # Handle files with spaces in the names
for file in ABS*; do
newfile="${file/foo/bar}" # Replace foo with bar
newfile="${newfile/baz/quux}" # Replace baz with quux (repeat as needed)
if [[ "$file" == "$newfile" ]]; then
echo "Not renaming $file - no change decreed."
elif [[ -f "$newfile" ]]; then
echo "Not renaming $file - $newfile already exists."
else
mv -- "$file" "$newfile" # Make the change
fi
done
答え2
適切な答えは名前の変更によって異なります。フィールド幅が一定であると仮定すると、シェルの組み込みパラメータ置換を使用して名前を変換できます。範囲は比較的制限されています。
さらに興味深いのは、次の文字クラスを使用することですsed
。
newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/\1-\2-/')
つまり、先行文字の接頭辞の後にダッシュを追加し、下線で終わる数字の後にダッシュを変更します。それダッシュで。
パラメータ置換を使用する可能な解決策とは異なり、この方法では、文字プレフィックスとゼロ以外のすべての長さの数値を受け入れます。したがって、これを入力として提供できます。
ABS1789_2563-01
ABS1789_2563-02
ABS1789_2563-02
ABSOLUTE1789_2563-01
ABSURD1789_2563-02
ABSOLVE1789_2563-02
PREFIX1793939389_2563-02
スクリプトに入れて
#!/bin/sh
for oldname in `cat foo4.txt`
do
newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/\1-\2-/')
echo "$oldname ->$newname"
done
(適切なループで)次の出力を提供します。
ABS1789_2563-01 ->ABS-1789-2563-01
ABS1789_2563-02 ->ABS-1789-2563-02
ABS1789_2563-02 ->ABS-1789-2563-02
ABSOLUTE1789_2563-01 ->ABSOLUTE-1789-2563-01
ABSURD1789_2563-02 ->ABSURD-1789-2563-02
ABSOLVE1789_2563-02 ->ABSOLVE-1789-2563-02
PREFIX1793939389_2563-02 ->PREFIX-1793939389-2563-02
答え3
すべてが次から始まる場合ABS1789_2563-
for f in ABS*; do mv "$f" ABS-1789-2563-${f:13}; done
ここ
ABS-1789-2563-
すべてのフォルダが次から始まると仮定してハードコードされています。ABS1789_2563-。
${f:13}
オフセット13から始まり、引数の最後まで拡張されます$f
。しばしば呼び出されます。サブストリング。バッシュから部分文字列拡張。
バラより3.5.3 シェルパラメータの拡張、部分:
${parameter:offset} ${parameter:offset:length}