4

接尾辞「.foo」が付いた特定のディレクトリ内のすべてのファイルを、同じベース名を含むが接尾辞が「.bar」に変更されたファイルに変換しようとしています。シェルスクリプトとforループでこれを行うことはできますが、同じ目標を達成するワンライナーを作成したいと思います。

目的:
  入力:*。foo
  出力:*。bar

これは私が試したことです:

find . -name "*.foo" | xargs -I {} mv {} `basename {} ".foo"`.bar

これは近いですが正しくありません。結果:
  入力:*。foo
  出力:*。foo.bar

指定されたサフィックスがベース名で認識されない理由について何か考えはありますか?「.foo」を囲む引用符は不要であり、省略しても結果は同じです。

4

6 に答える 6

4

basenameファイル拡張子を処理できますが、シェルパラメータ拡張機能を使用する方が簡単です。

for file in *.foo; do mv "$file" "${file%.foo}.bar"; done

は1回しか実行されないため、コードはbasename機能しません。basenameその後、xargsは{}.bar毎回表示されます。

于 2011-08-19T18:30:42.700 に答える
2

*.foo内のファイルの場合; mv$fileを実行しますecho $file | sed 's/\(.*\.\)foo/\1bar/'; 終わり

例:

$ ls
1.foo  2.foo
$ for file in *.foo ; do mv $file `echo $file | sed 's/\(.*\.\)foo/\1bar/'` ; done
$ ls
1.bar  2.bar
$ 
于 2011-08-19T18:26:01.693 に答える
1

for x in $(find .-name "* .foo"); mv $ x $ {x %%foo}barを実行します。終わり

于 2011-08-19T18:30:37.287 に答える
1
$ for f in *.foo; do echo mv $f ${f%foo}bar; done
mv a.foo a.bar
mv b.foo b.bar

準備ができたら取り外しechoます。

于 2011-08-19T18:31:36.147 に答える
-1

インストールmmvしている場合は、

mmv \*.foo \#1.bar

于 2011-08-19T19:10:50.960 に答える
-1

スクリプトやループの代わりに「名前の変更」を使用してみませんか。

RHEL:rename foo bar .*foo

Debian:rename 's/foo/bar/' *.foo

于 2014-10-07T04:17:48.723 に答える