ファイル名の終わりを除いて、同じ名前の複数のファイルの名前を変更したいと思います。増分カウンターで他の部品を交換したいです。たとえば、次のファイルを使用します。
71116_123 71116_134 71116_113 71116_023
71116_923 71116_103 71116_125 71116_223
名前を次に変更したいです。
71116_1 71116_2 71116_3 71116_4
71116_5 71116_6 71116_7 71116_8
同様の質問が見つかりましたここしかし、与えられた解決策は少し複雑に見えます!より簡単な解決策がありますか?
答え1
そのため、ご提供いただいた情報が限られておりますので、ご家庭を明記して間違いがあれば教えてください。回答を調整できます。これらの仮定は、論理を単純かつ明確に保つために重要です。それ以外の場合は「過剰」モードになります。
仮定 1. ファイルの「サフィックス」は変更する項目であり、「サフィックス」は下線の後の数字です。これは、アンダースコア( "_")が区切り文字であることを意味します。
仮定 2. 元のファイル名には下線が 1 つしかありません。下線が2つ以上なく、下線も絶対にありません。
前提3.「プレフィックス」(つまり、区切り文字の前の値(仮定1で定義))がまったく同じになるようにしたい。
仮定 4. 元のサフィックスに関係なく、新しいサフィックスが同じ区切り文字 (仮定 1 で定義されているとおり) を使用し、新しいサフィックスの名前がタイムスタンプまたは以前のソート順以外の値によって徐々に変更されないようにします。ファイル名の元の英数字のソート順)。
仮定 5. 残念ながら、完全にランダムな非常に「単純」にしたいが、私はそれを「複雑な for ループや while ループがなく」「奇妙な sed または awk コマンドがあまり多くない」と定義します。
したがって、難しい問題ではありませんが、リストされた制約を考慮すると興味深い課題になります。とにかく、私はまだ「単純な」forループと「簡単な」awkを使用していました。
cnt=0
for i in *; do
let cnt=cnt+1
mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done
同じディレクトリに名前を変更したくない他のファイルがある場合は、最初のテストの場合と同じように(/tmp
そのディレクトリでテストしていたので、名前を変更したくない他のファイルがありました)、次の部分を使用して次のようにプレフィックスをフィルタリングします。します。
cnt=0
for i in 71116*; do
let cnt=cnt+1
mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done
私はあなたのリンクから答えを見ました。 Stackexchangeの多くの答えのように過剰であることに同意します。しかし、ほとんどの「過度の」回答はより少ない仮定に依存するので、理論的には私がここで提供するよりも「一般的」および/または「移植性」があります。