grepとforを使用してファイルの名前を変更する

grepとforを使用してファイルの名前を変更する

.txt、.data、.conf拡張子を持つファイル名を「.xml」に変更したいと思います。

Hello.txt -> Hello.xml

これを行うには、ファイルに次の行も含める必要があります。<?xml version="1.0" encoding="UTF-8"?>

これが私が持っているものです:

for file in *
do
if [ $(grep -Rc '<?xml version="1.0" encoding="UTF-8"?>' --include ".txt" --include ".data" --include "*.conf") = true ]
then
rename extension to: .xml
fi
done

どんなアイデアがありますか?

ベストアンサー1

もしあなたなら必要grepそれでは、forこのようなことが起こりますか?

grep -RlZ '<?xml version="1.0" encoding="UTF-8"?>' --include "*.txt" --include "*.data" --include "*.conf" | 
  xargs -0 sh -c 'for f; do echo mv -- "$f" "${f%.*}.xml"; done' sh

echo正しいことをしていると確信している場合は削除してください)。

  • grep -RlZ一致する項目が見つかったファイル名の空の区切りリストを出力します。

  • xargs -0この空で区切られたリストを次に渡します。sh -c

  • for f位置引数でファイル名を繰り返します。

whileまたは(代わりに利用可能な場合for)、xargsシェルスクリプトレットをスキップして追加することもできます。

grep -RlZ '<?xml version="1.0" encoding="UTF-8"?>' --include "*.txt" --include "*.data" --include "*.conf" | 
  while IFS= read -r -d '' f; do echo mv -- "$f" "${f%.*}.xml"; done

おすすめ記事