2017-04-03 9 views
1

現在のディレクトリ内のすべてのファイルの名前を ".hola"から ".txt"に変更するワンライナーを作成する必要があります。例えばawk区切り文字でALL行で最後のフィールドを取得する

ls -1 *.hola | awk '{NF="";print "$0.hola $0.txt"}'(*)

そしてxargs mv -Tに標準入力を渡す:

sample.hola and name.hi.holaは、私のようなものを考えていた

それぞれsample.txtname.hi.txtに変更されます|

しかし、例の(*)の出力はsamplename hiとなります。

を使用してname.hi.holaの出力をname.hiにするにはどうすればよいですか?

+0

http://stackoverflow.com/questions/13857836/display-all-fields-except-the-lastを参照してください。次に 'echo name.hi.hola | awk 'BEGIN {OFS = "。"; FS = "。"} {NF - ;印刷}' '。これをあなたの例に適応させることができます。 Mark Reedの答えはあなたが解決しようとする問題に適しています。 – zedfoxus

+1

そのような 'NF'の変更は、BSD/MacOS awkではなく、GNU awkでのみ動作することに注意してください。 –

答えて

3

あなたはなぜこれにawkを巻き込みたいのですか?

$ for f in *.hola; do echo mv "$f" "${f%hola}txt"; done 
mv name.hi.hola name.hi.txt 
mv sample.hola sample.txt 

出力が満足できる場合は、echoを削除してください。

+0

宿題のためにawkが欲しかったのですが、今あなたの解決策を見て、あなたが' $ {f %hola} .txtを使って "hola"を置き換えます。ありがとう! –

1

具体的な問題については、renameコマンドをお勧めします。システムのバージョンに応じて、rename -s .hola .txt *.holaまたはrename 's/\.hola$/.txt/' *.holaのいずれかを実行できます。

また、lsを使用してファイル名を取得しないでください。 ls *.holaを実行すると、シェルは、そのパターンに一致するすべてのファイル名のリストに*.holaを展開し、その時点でlsが賞賛されています。その時点ではechoです。たとえば、次のような結果を得ることができます。 printf '%s\n' *.holaシェル外のプログラムを実行しないでください。

awkには.holaを削除しようとしていません。

awk -F. '{old=$0; NF-=1; new=$0".txt"; print old" "new}' 

BSD/MacOSのawk上では動作しません:あなたはGNU AWKを持っている場合、あなたはこのような何かを行うことができます。その場合、あなたはこのような何か行うことができます。

awk -F. '{ 
    old=$0; new=$1; 
    for (i=2;i<NF;++i) { new=new"."$i }; 
    print old" "new".txt"; }' 

いずれかの方法を、私は@EdMortonは、おそらくより良いawkベースのソリューションを持っていると確信しています。

+0

私はあなたの 'awk'ソリューションを試してみましたが、私は同じ出力を得ました。入力のドットが' new'で消えてしまいました。私は 'rename'コマンドを知りませんでした。もっと調査しなければならないと思います。 'ls -1 * .hola'を使うと、すべての列に表示されます。 –

+0

'printf '%s \ n' * .hola'も列に出力されます –

0

これはいかがですか?簡単でわかりやすい:

for file in *.hola; do mv "$file" "${file/%hola/txt}"; done 
+0

mmmm私は 'bash'コマンドラインについてもっと学ぶべきだと思います。 $ {file /%hola/text} 'がそれらの" hola's "に取って代わることはわかりませんでした。私は解決策が宿題のために「awk」を使っていたと思う。 –

関連する問題