元のトピックの著者は、問題を真正面から解決することを提案しています。つまり、 すべてのファイルをコピーしてから、不要なファイルを削除します。 もちろん、ビデオコレクションを除き、ホームフォルダー全体をUSBフラッシュドライブにコピーする必要がない場合、これは良い解決策になります。
しかし、このアプローチの主な問題は異なります-それはUnixのイデオロギーに対応していません:複雑なタスクは単純なユーティリティの組み合わせによって解決されます。
このクラスの問題を解決する方法に関する猫の詳細の下で-これを既製のレシピとは考えないでください。
0.分解
複雑な問題の解決策は、コンポーネント部分の分析から始まります。 そのため、最初にフィルタリングしてファイルのセットをコピーする必要があります。
だから-ファイルのリストの取得、フィルタリング、コピー。
1.ファイルのリストを取得する
通常、lsを使用してファイルのリストを調べます。 彼女の出力は次のようになります。
$ ls -1 dir1 dir2 file1.bin file2.txt
そのような結論はありますか? いいえ、十分な情報がないため、ファイルを再帰的にコピーする必要があります。つまり、チェーンの最初のプログラムがパスとともにファイル名を返した方がはるかに便利です。
頭に浮かぶ次のプログラムはfindです
$ find ./ ./ ./dir1 ./dir1/file7.txt ./dir2 ./file1.bin ./file2.txt
すでに良いのですが、ディレクトリも出力に含まれていますが、それらは必要ありません。 これを試してみましょう:
$ find ./ -type 'f' ./dir1/file7.txt ./file1.bin ./file2.txt
ここに必要なものがあります。 ファイルリスト。
2.フィルタリング
このファイルのリストはフィルタリングする必要があります。 前のコマンドの出力をgrepプログラムにリダイレクトします。
$ find ./ -type 'f' | grep 2 ./dir2 ./file2.txt
でも、タスクの条件ではファイルを除外する価値があるので、 パイプラインを少し変更しましょう
$ find ./ -type 'f' | grep -v 2 ./dir1/file7.txt ./file1.bin
最初の2つの部分が完了しました。
3.コピー
cpコマンドのmanページから、ソースファイルを引数としてcpプログラムに渡す必要があることがわかりますが、現時点ではリストを標準入力にリダイレクトすることしかできません。
xargsユーティリティを使用してみましょう-標準入力を受け入れ、指定されたプログラムを標準入力のパラメーターで呼び出します。 だから:
$ find ./ -type 'f' | grep -v 2 | xargs -n 1 -I % cp --parents "%" /path/to/dest/dir/
-n 1は、標準入力からの1行のみがコマンドに置き換えられることを意味し、-I%-ターゲットコマンドで標準入力からの行に置き換えられる文字を定義します。 私たちの場合、それは
cp --parents "./dir1/file7.txt" /path/to/dest/dir/ cp --parents "./file1.bin" /path/to/dest/dir/
問題が解決されたと仮定できます。
結論の代わりに
この説明が、このような単純なタスクとより複雑なタスクの両方のソリューションに正しくアプローチするのに役立つことを願っています。
私はそれに注意したい
- これは、問題を解決するためのトピックであり、ファイルのコピーではなく、パイプラインの使用について少し説明しています。
- この方法は、唯一ではなく、最短でもありませんが、ソリューションの方法論を示すために最も明白です。
- この特定のタスクの場合、
find ./ -type f ! -name "*2*" -exec cp --parents -t /target/dir "{}" \+
を使用する方が高速find ./ -type f ! -name "*2*" -exec cp --parents -t /target/dir "{}" \+
find ./ -type f ! -name "*2*" -exec cp --parents -t /target/dir "{}" \+
- 個人的には、
tar --exclude=2 -cf - ./ | ( cd /path/to/dest/ && tar -xvf - )
を使用しますtar --exclude=2 -cf - ./ | ( cd /path/to/dest/ && tar -xvf - )
tar --exclude=2 -cf - ./ | ( cd /path/to/dest/ && tar -xvf - )
- なぜなら これは私の最初のトピックです。建設的な批判を喜んでいます