Linuxにファイルのリストがありますが、これを短くしたいと思います。その形式は WhatIWant_WhatIDoNotWant.txt です。
WhatIWant.txtのように簡単に作成する方法はありますか?次の質問(下のリンク)を見て、for doループが本当に好きですが(結果に重複がある場合に備えて)、アンダースコア(_)の位置値を取得して代わりに入力する方法がわかりません。 16文字をエンドポイントとして使用しています...
答え1
変数拡張は${varname%_*}
(最後)から文字列の終わりまで_
すべてを削除します。
例えば
$ name=WhatIWant_WhatIDontWant.txt
$ echo "${name%_*}"
WhatIWant
削除もできますので参考にしてください.txt
。
したがって、単純なループを作成できます。
for name in *.txt
do
mv -i -- "$name" "${name%_*}.txt"
done
これを再帰的にしたい場合は、次のようになります。
find . -name '*.txt' | while read -r "name"
do
mv -i "$name" "${name%_*}.txt"
done
十分かもしれませんが、ファイルに戻り文字が含まれている場合は注意してください。これによりサイクルが壊れる可能性があります。
答え2
# We loop over the files with filename suffix .txt
for f in *.txt; do
# We rename the file removing _ and the remaining part including the extension
mv -- "$f" "${f/_*}.txt"
done