条件付きで「mv」コマンドを実行する方法 - 特定の末尾を持つファイルを他のフォルダーに移動する

条件付きで「mv」コマンドを実行する方法 - 特定の末尾を持つファイルを他のフォルダーに移動する

私はコンピューターサイエンスの学生です。2年生で、Linuxについて学んでいます。コロナウイルスのため、自主的に勉強しています。勉強中に、いくつかのセクションに分かれた問題に遭遇しましたが、解くことができません。

質問ではmv、いくつかのファイルをフォルダーに転送するコマンドを実行するように求められています。mvコマンドを実行しようとし、「パイプ」またはのような他のコマンドを統合しようとしましたfind

これは私の意見では通常のコマンドではありませんmv。もっと多くのものを統合する必要がありますが、どうしたら解読できるでしょうか。数日間この質問の解決を試み、フォーラムで同様の質問を探してみましたが、見つけられませんでした。

質問:

  1. .cフォルダーで終わるすべてのファイルをフォルダー.hにコピーするコマンドを 1 つ記述しますPrograms

私の試みはおそらくそれを実行することでした:

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にファイルがコピーされることになります。「ProgramsProgramsfind の -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用のGNU が必要です。-executable-readable

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

関連情報