ファイルのリストを再帰的に検索しようとしていますが、ファイルに文字列が含まれている場合は、ファイル名をその文字列の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