3

問題

ディレクトリには、*-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 行で解決する方法はありますか? ?

4

1 に答える 1

6

名前変更コマンドを試しましたか?

例えば:

rename 's/-foo-bar//' *-foo-bar.txt

利用できるものがない場合は、、、およびを使用findsedますxargs

find . -maxdepth 1 -mindepth 1 -type f -name '*-foo-bar.txt' | sed 's/-foo-bar.txt//' | xargs -I{} mv {}-foo-bar.txt {}.txt
于 2012-10-01T14:06:52.030 に答える