ファイルから文字列を検索し、結果として複数のファイルの名前を変更します。

ファイルから文字列を検索し、結果として複数のファイルの名前を変更します。

ファイルのリストを再帰的に検索しようとしていますが、ファイルに文字列が含まれている場合は、ファイル名をその文字列のgrep結果に変更します。

サンプルファイルには次のコンテンツが含まれています。

file1   
foo bar1

file2
foo bar2

file3
foo bar3

file4
foo bar4

file5
foo bar5

grep+awk は必要な結果を返します。

$ grep -r "^foo" . | awk '{print $2}'
bar1
bar2
bar3
bar4
bar5

私はこの結果をmvコマンドに渡す必要があると主張します。

$ grep -r "^foo" . | awk '{print $2}' | xargs -I{} mv {} .
mv: cannot stat 'bar1': No such file or directory
mv: cannot stat 'bar2': No such file or directory
mv: cannot stat 'bar3': No such file or directory
mv: cannot stat 'bar4': No such file or directory
mv: cannot stat 'bar5': No such file or directory

よろしくお願いします。 Gnu / BSD Grepの結果は同じです。

ベストアンサー1

ループ用のシェルを使いましょう。

for match in "$(grep -ro '^foo.*')";do
    echo mv "${match%:*}" "${match#*:}"
done

その後、すべての一致を繰り返し、file:matching-substring文字%列演算子を使用して#すべての項目を削除します。 :.

パターンの部分文字列ではなく行全体を一致させるには、次のようにします。

for match in $(grep -r '^foo');do

一致とファイル名にスペースが含まれる可能性があるため、二重引用符を使用してください。

パターンで一致させたいが、行の2番目の単語に一致するようにファイル名を変更する場合:

for match in "$(grep -ro '^foo.*')";do
    fname=$("echo ${match#*:}|awk '{print $2}'")
    echo mv "${match%:*}" "$fname"
done

おすすめ記事