フォルダ名に特殊文字を追加する

フォルダ名に特殊文字を追加する

次の命名規則に従う長いフォルダのリストがあります。

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}

関連情報