一部を除外してファイルとフォルダーをコピーする方法

同様のトピックに対応して書かれたトピック。

元のトピックの著者は、問題を真正面から解決することを提案しています。つまり、 すべてのファイルをコピーしてから、不要なファイルを削除します。 もちろん、ビデオコレクションを除き、ホームフォルダー全体を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/ 


問題が解決されたと仮定できます。

結論の代わりに


この説明が、このような単純なタスクとより複雑なタスクの両方のソリューションに正しくアプローチするのに役立つことを願っています。

私はそれに注意したい

Source: https://habr.com/ru/post/J150830/


All Articles