5

findコマンドからファイル名を操作しようとしています。

find . -name "*.xib" -exec echo '{}' ';'

たとえば、次のように出力されます。

./Views/Help/VCHelp.xib

私はそれを作りたいです:

./Views/Help/VCHelp.strings

私が試したこと:

find . -name "*.xib" -exec echo ${'{}'%.*} ';'

しかし、「{}」は文字列などとして認識されていません。


私も次のことを試しました:

find . -name "*.xib" -exec filename='{}' ";" -exec echo ${filename%.*} ";"

しかし、変数を割り当てる代わりに、「filename」というコマンドを実行しようとしています。

検索:ファイル名:そのようなファイルまたはディレクトリはありません

4

3 に答える 3

7

リテラル文字列でパラメータ拡張を使用することはできません。最初に変数に保存してみてください。

find . -name '*.xib' -exec bash -c "f='{}' ; echo \${f%.xib}.strings" \;

-execはコマンドとしてその後の最初の引数を参照します。したがって、指定したものを実行するためにを使用しないfilename='{}'ため、単純に指定することはできません。いくつかのシェルのものを実行したい場合は、を使用するか、まとめる必要があります。findshshbash

または使用sed

find . -name '*.xib' | sed 's/.xlib$/.strings/'
于 2012-11-26T11:27:26.803 に答える
2

このような単純な検索には、純粋なbashソリューションを使用できます。

#!/bin/bash

shopt -s globstar
shopt -s nullglob

found=( **.xib )

for f in "${found[@]}"; do
   echo "${f%xib}strings"
done

シェルglobstarオプションをオンにすると、**「すべてのファイルと0個以上のディレクトリおよびサブディレクトリを照合する」ことが可能になります(bashリファレンスマニュアルから引用)。このnullglobオプションは、一致するものがない場合に役立ちます。この場合、globは醜いのではなく何にも展開されません**.xib。このソリューションは、面白い文字を含むファイル名に関して安全です。

于 2012-11-26T14:23:38.417 に答える
1
find . -name "*.xib" | sed -e 's/\.xib$/.strings/'
于 2012-11-26T11:27:13.310 に答える