4

指定された文字列を含むすべてのファイルを検索し、それらすべてのファイルの内容をクリアしようとしています。したがって、「stringtofind」が含まれているファイルは、その後空のファイルになります。

これを行うために、次のことを試しましたが、エラーが発生します。

次の場合、エラーが発生します:find:`-exec'への引数がありません

 find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l -exec sed -i '/./d'

次の場合、エラーが発生します。

grep:/ nis

/tset.any

/test2.file

/test.txt

:そのようなファイルまたはディレクトリはありませんsed:入力ファイルはありません

find / -maxdepth 1 -xdev -type f -print | xargs -0 grep -i "stringtofind" -l | xargs sed -i '/./d'
4

5 に答える 5

5

引数が欠落しているfindコマンドは、ほぼ機能しています。試す:

find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -l {} \; -exec sed -i '/./d' {} \;

-exec各アクションの最後にバックスラッシュでエスケープされたセミコロンを追加{}し、ファイル名をどこに置き換えるかを知らせるために追加する必要があります。

于 2012-12-12T16:36:46.123 に答える
2

{}にファイルマーカー( )と終了(;または+)を指定する必要があります-exec。さらに、GNU並列でファイルを処理することをお勧めします。

find / -maxdepth 1 -xdev -type f -exec grep -li "stringtofind" {} + | 
  parallel sed "'/./d'" '{}'

改行を含むファイル名を処理するには、他の人が提案しているようにゼロターミネーションを使用する必要があります。

find / -maxdepth 1 -xdev -type f -exec grep -Zli "stringtofind" {} + | 
  parallel -0 sed "'/./d'" '{}'

編集

非並列依存の代替案は次のとおりです。

find / -maxdepth 1 -xdev -type f -exec grep -Zli "stringtofind" {} + | 
  while IFS= read -r -d $'\0' file; do
    sed '/./d' "$file"
  done
于 2012-12-12T11:59:55.887 に答える
1

スペースを含むファイル名に問題があります。の-0引数を使用する場合は、の最後の引数としてxargs使用する必要があります。これに満足しているはずです。-print0findgrep

ただし、これによりとの間のパイプの問題は解決されますが、パイプfind内のゼロで区切られた名前をからにgrep渡すことはできません。したがって、まだ文句を言うでしょう...grepsedsed

したがって、を使用してテストしgrepfind次のよう-execに単一のパイプを使用する必要がありsedます。プレースホルダーを二重引用符"で囲むことに注意してください。{}

find / -maxdepth 1 -xdev -type f -exec grep -i "stringtofind" -q "{}" \; -print0 | xargs -0 sed '/./d'

コマンドの最初の部分のみを実行することで、空になるファイルのリストを取得できるという利点があります。これには、までが含まれますが、含まれていません|

于 2012-12-12T11:51:49.013 に答える
1
find / -maxdepth 1 -xdev -type f|xargs grep -l 'string'| xargs perl -pi -e 's/.*\n//g'

上記のコマンドは、ファイル内の改行も削除します。新しい行を保持し、すべての行の内容を削除する場合は、以下を使用してください。

find / -maxdepth 1 -xdev -type f|xargs grep -l 'string'| xargs perl -pi -e 's/.//g'
于 2012-12-12T11:52:28.540 に答える
0

一方通行:

$ for file in $(find / -maxdepth 1 -xdev -type f  -exec grep -li stringtofind '{}' \;)
> do
>   > $file
> done
于 2012-12-12T11:59:01.453 に答える