アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。必要なときのみシェル、ごくたまにシェルスクリプトを利用する程度なため、非常に初歩的なことだとは思うのですが、すっかりどつぼにはまってしまい、調べてもらちがあかないので、質問させてください。

cp コマンドで、特定の文字列を「含まない」ファイルすべてを指定してコピーするにはどうしたらいいでしょうか。

cpにオプションがなかなか見つからないので findと組み合わせようと思ったのですがこれでも思うようにいかず、苦闘の末find, grepを総動員してcp `find /dir * | grep -vl 'mojiretsu'` などとやってみましたが引数が多すぎると怒られて終わり(泣)。

よい方法をぜひご伝授ください。要するにコピーが目的ですので別のコマンドでもかまいません。

A 回答 (3件)

ファイル名じゃなくて、ファイルの内容に、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さんので良いと思います。

この回答への補足

ご指摘ありがとうとうございます。内容でなくファイル名の話ですが、参考になりました。ちょっといま試す時間が取れないので2,3日後にやってみます。とりあえずお礼まで

補足日時:2005/05/16 22:39
    • good
    • 0

修正です。


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<-------

この回答への補足

ありがとうございます。やはり単にオプションで解決できる問題ではなかったようですね。上記、恥ずかしながら知らないコマンドがありますので勉強して試してみます。あさってくらいになると思うのでとりあえずお礼まで

補足日時:2005/05/16 22:23
    • good
    • 0

あるディレクトリ(srcdir)からある文字列(mojiretsu)がファイル名に含まないファイル全てをあるディレクトリ(distdir)にコピーする場合



% find srcdir ! -name '*mojiretsu*' | xargs -I'%' cp % distdir

ではどうでしょうか?
ただ、これはコピー先ディレクトリ配下1箇所に集める事になります。
ちなみにディレクトリ構成を保持しつつあるディレクトリ配下にコピーしたい場合には、

% find srcdir ! -name '*mojiretsu*' | cpio -pdv distdir
 
とかになります。
 
一応、

% find srcdir ! -name '*mojiretsu*'

の出力結果が希望しているファイルのみ表示されるか確認して、それで大丈夫なら実際にコピーを試してみて下さい。
 
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!