2016-05-19 17 views
1

"*.data.done"という名前のファイルがあるとします。 (動作していないbashのxargs {}から文字を取り除く

grep -l -R -F "pattern" --include '*.data.done' * | xargs -I{} mv {} ${{}::-5} 

まあ、「の.done」は、このストリッピングを:今、私は戻って私たちが行くので、ここ"pattern"

を含む「* .DATA」、その後のものに(再帰的に)それらの名前を変更したいですbash 4.3.11):

bash: ${{}::-5}: bad substitution 

これを最も簡単に行うにはどうすればよいですか?

+0

私は小さなスクリプトを作成したい: '内のファイルのために"$ @"; mv "$ file" "$ {file%.done}"を実行します。 'moveit.sh'ファイルで' done'を実行してから 'xargs sh moveit.sh'を実行してください。シンプルで、 'moveit.sh'ファイルをクリーンアップするのは大きなオーバーヘッドではありません。 –

+0

'{}'はシェル変数ではありません。シェル変数の拡張はできません。 – 123

答えて

3

プレースホルダ{}は、BASHの文字列操作${...}では使用できません。

を使用でき

:しかし

grep -lRF "pattern" --include '*.data.done' . | 
xargs -I{} bash -c 'f="{}"; mv "$f" "${f/.done}"' 

あなたはファイルごとに産卵サブシェルを避けたいならば、forループを使用します。

while IFS= read -d '' -r f; do 
    mv "$f" "${f/.done}" 
done < <(grep -lRF "pattern" --include '*.data.done' --null .) 
関連する問題