私はコンピューターサイエンスの学生です。2年生で、Linuxについて学んでいます。コロナウイルスのため、自主的に勉強しています。勉強中に、いくつかのセクションに分かれた問題に遭遇しましたが、解くことができません。
質問ではmv
、いくつかのファイルをフォルダーに転送するコマンドを実行するように求められています。mv
コマンドを実行しようとし、「パイプ」またはのような他のコマンドを統合しようとしましたfind
。
これは私の意見では通常のコマンドではありませんmv
。もっと多くのものを統合する必要がありますが、どうしたら解読できるでしょうか。数日間この質問の解決を試み、フォーラムで同様の質問を探してみましたが、見つけられませんでした。
質問:
.c
フォルダーで終わるすべてのファイルをフォルダー.h
にコピーするコマンドを 1 つ記述しますPrograms
。
私の試みはおそらくそれを実行することでした:
find "*.c" -o "*.h" | mv Programs
答え1
この割り当ては、次の 3 つの方法で解釈できます。
- すべてのファイル
.c
をコピー.h
現在のディレクトリからディレクトリにPrograms
、または - すべてのファイル
.c
をコピー.h
現在のディレクトリまたはその下の任意の場所からディレクトリへPrograms
。 - アクセス可能なすべてのコピー
.c
と.h
システム上のどこからでもディレクトリへPrograms
。
割り当てでは「移動」ではなく「コピー」と表示されていることに注意してください。つまり、cp
ではなく コマンドを使用する必要がありますmv
。
課題の最初の解釈は次のように解決される。
cp *.[ch] Programs
(*.[ch]
関心のあるすべてのファイルに一致し、現在のディレクトリにこれらのファイルが数千個も存在しないことを前提としています)。
課題の2番目の解釈は次のように解決されます。
find . -path ./Programs -prune -o -type f -name '*.[ch]' -exec cp {} Programs \;
これは、現在のディレクトリ内またはその下にある、.c
またはファイル名のサフィックスを持つすべての通常ファイルを検索し、各ファイルに対して実行します。このユーティリティは標準入力ストリームを読み取らないため、パイプすることはできません。.h
cp
cp
また、避けるディレクトリ内を検索します(現在のディレクトリのサブディレクトリであると想定されます)。これを行わないと、からPrograms
にファイルがコピーされることになります。「Programs
Programs
find の -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
ソリューションでは隠しファイル (名前がドットで始まるファイル) がコピーされますが、最初のソリューションでは、デフォルトでこれらの種類の名前と一致しません。