- 締切済み
特定文字列を除外してcpする方法
こんにちは。必要なときのみシェル、ごくたまにシェルスクリプトを利用する程度なため、非常に初歩的なことだとは思うのですが、すっかりどつぼにはまってしまい、調べてもらちがあかないので、質問させてください。 cp コマンドで、特定の文字列を「含まない」ファイルすべてを指定してコピーするにはどうしたらいいでしょうか。 cpにオプションがなかなか見つからないので findと組み合わせようと思ったのですがこれでも思うようにいかず、苦闘の末find, grepを総動員してcp `find /dir * | grep -vl 'mojiretsu'` などとやってみましたが引数が多すぎると怒られて終わり(泣)。 よい方法をぜひご伝授ください。要するにコピーが目的ですので別のコマンドでもかまいません。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
ファイル名じゃなくて、ファイルの内容に、mojiretsu が含まれないファイルをコピーするのですよね? grep -vl は、「文字列を含まないファイル名を得る」とは違い、「文字列が含まれない行を持つファイル名を得る」なので使えません。それ以前にfindコマンドの使い方がおかしいですが。 for i in /dir/* do grep mojiretsu $i >/dev/null || cp $i /to-dir done のように対象を1ファイルずつチェックするか、 ls -1 /dir/* > /tmp/1 grep -l mojiretsu /dir/* > /tmp/2 cp `comm -23 /tmp/1 /tmp/2` /to-dir のように全ファイル名の一覧と、文字列を含むファイル名の一覧の差分をとるか。 もし内容でなくファイル名の話だったら#2さんので良いと思います。
- Lean
- ベストアンサー率72% (435/603)
修正です。 No.1のままだとディレクトリもコピーされるので普通のファイル(レギュラーファイル)のみコピー対象に変えます。 No.1を以下のように読み替えてください。 -------8<------- % find srcdir ! -name '*mojiretsu*' | xargs -I'%' cp % distdir ↓ % find srcdir ! -name '*mojiretsu*' -type f | xargs -I'%' cp % distdir -------8<------- -------8<------- % find srcdir ! -name '*mojiretsu*' | cpio -pdv distdir ↓ % find srcdir ! -name '*mojiretsu*' -type f | cpio -pdv distdir -------8<------- -------8<------- % find srcdir ! -name '*mojiretsu*' ↓ % find srcdir ! -name '*mojiretsu*' -type f -------8<-------
補足
ありがとうございます。やはり単にオプションで解決できる問題ではなかったようですね。上記、恥ずかしながら知らないコマンドがありますので勉強して試してみます。あさってくらいになると思うのでとりあえずお礼まで
- Lean
- ベストアンサー率72% (435/603)
あるディレクトリ(srcdir)からある文字列(mojiretsu)がファイル名に含まないファイル全てをあるディレクトリ(distdir)にコピーする場合 % find srcdir ! -name '*mojiretsu*' | xargs -I'%' cp % distdir ではどうでしょうか? ただ、これはコピー先ディレクトリ配下1箇所に集める事になります。 ちなみにディレクトリ構成を保持しつつあるディレクトリ配下にコピーしたい場合には、 % find srcdir ! -name '*mojiretsu*' | cpio -pdv distdir とかになります。 一応、 % find srcdir ! -name '*mojiretsu*' の出力結果が希望しているファイルのみ表示されるか確認して、それで大丈夫なら実際にコピーを試してみて下さい。
補足
ご指摘ありがとうとうございます。内容でなくファイル名の話ですが、参考になりました。ちょっといま試す時間が取れないので2,3日後にやってみます。とりあえずお礼まで