問題
ディレクトリには、*-foo-bar.txt という形式のファイルがあります。
ディレクトリの例:
$ ls *-*
asdf-foo-bar.txt ghjk-foo-bar.txt l-foo-bar.txt tyui-foo-bar.txt
bnm-foo-bar.txt iop-foo-bar.txt qwer-foo-bar.txt zxcv-foo-bar.txt
目的のディレクトリ:
$ ls *.txt
asdf.txt bnm.txt ghjk.txt iop.txt l.txt qwer.txt tyui.txt zxcv.txt
解決策 1
私の頭に浮かんだ最初の解決策は、この醜いハックのように見えます。
ls *-* | cut -d- -f1 | sed 's/.*/mv "\0-foo-bar.txt" "\0.txt"/' > rename.sh && sh rename.sh
上記のソリューションは、ファイルの名前を変更するスクリプトをオンザフライで作成します。このソリューションは、 http://mywiki.wooledge.org/ParsingLsls
に従って行うのは良いことではない出力の解析も試みます。
解決策 2
この問題は、次のようなシェル スクリプトを使用すると、よりエレガントに解決できます。
for i in *-*
do
mv "$i" "`echo $i | cut -f1 -d-`.txt"
done
上記のソリューションでは、ループを使用してファイルの名前を変更しています。
質問
ループを明示的にスクリプト化したり、スクリプトを生成したり、新しいシェルまたは現在のシェルを呼び出したりする必要がないように (つまり、sh、bash、. などのコマンドを避ける)、この問題を 1 行で解決する方法はありますか? ?