"mv"コマンドを条件付きで実行する方法 - 特定の終わりを持つファイルを別のフォルダに移動する

私はコンピュータ工学を専攻する学生です。 2年生 - 私はLinuxを学んでいます。コロナウイルスのために独立して勉強しています。勉強中、私はさまざまな部分に関する問題を発見しました。私はそれを解決することができませんでした。

質問は私がmvコマンドを実行したいと思います。一部のファイルをこのフォルダに転送します。そのコマンドを実行してみましたmv"パイプ"またはfind

私の考えでは、これは一般的なmvコマンドではなく、より多くを統合する必要があると思われ、復号化できません。私はこの問題を解決するために数日間努力しました。私もフォーラムで同様の質問を見つけようとしましたが、見つかりませんでした。

質問:

  1. このフォルダー.cで終わるすべてのファイルをコピーするコマンドを作成します。.hPrograms

私の試みは次のとおりです。

find "*.c" -o "*.h" | mv Programs

ベストアンサー1

この割り当ては3つの方法で解釈できます。

  1. .cフルと.hファイルのコピー現在のディレクトリからディレクトリPrograms
  2. .cフルと.hファイルのコピー現在のディレクトリまたはその下のどこでもディレクトリにPrograms
  3. アクセス可能なすべてのアイテムをコピー.cして.h システムどこでもディレクトリにPrograms

割り当てには「移動」ではなく「コピー」とされています。これはcp代わりにこのコマンドを使用する必要があることを意味しますmv

課題の最初の説明は次のように解決されます。

cp *.[ch] Programs

*.[ch]関心のあるすべてのファイルが一致し、現在のディレクトリに何千ものファイルがないとします。)

課題の2番目の解釈は、次のように解決されます。

find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

これは、現在のディレクトリ内またはその下.cまたはファイル名サフィックスを持つすべての一般ファイルを検索し、そのような各ファイルで実行されます。ユーティリティは標準入力ストリームを読み取らないため、パイプを介して接続できません。.hcpcp

私達はまた保証します避けるディレクトリ内を調べますPrograms(現在のディレクトリ内のサブディレクトリであると仮定)。そうしないと、最終的に.seeからファイルがProgramsコピーされます。Programsfindの-pathおよび-pruneオプションの説明"-pathとの詳細については-prune

第3の解釈は第2の解釈から容易に続く。

find / -path "$PWD/Programs" -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;

find...ディレクトリツリーの先頭から始まり、Programs避けるべきディレクトリがパス内のディレクトリであることを指定します$PWD/Programs

どこにでもアクセスできないため、多くのエラーが発生する可能性があります。これを防ぐには、アクセスできないディレクトリも削除して読み取り可能なファイルのみをコピーしてください。

find / \( -type d ! -executable -o -path "$PWD/Programs" \) -prune -o \
    -type f -name '*.[ch]' -readable -exec cp {} Programs \;

これfindには-executableテスト(ディレクトリが実行可能な場合はディレクトリは検索可能)と-readableテストにGNUが必要です。

findここで、バリアントはファイルを通常のファイル(testパススルー)に制限しますが-type f、このcp *.[ch]メソッドはその2文字で終わるすべての種類のコンテンツをコピーします。また、このfindソリューションは隠しファイル(名前がドットで始まるファイル)をコピーしますが、最初のソリューションはデフォルトでこれらのタイプの名前と一致しません。

おすすめ記事