私はコンピュータ工学を専攻する学生です。 2年生 - 私はLinuxを学んでいます。コロナウイルスのために独立して勉強しています。勉強中、私はさまざまな部分に関する問題を発見しました。私はそれを解決することができませんでした。
質問は私がmv
コマンドを実行したいと思います。一部のファイルをこのフォルダに転送します。そのコマンドを実行してみましたmv
"パイプ"またはfind
。
私の考えでは、これは一般的なmv
コマンドではなく、より多くを統合する必要があると思われ、復号化できません。私はこの問題を解決するために数日間努力しました。私もフォーラムで同様の質問を見つけようとしましたが、見つかりませんでした。
質問:
- このフォルダー
.c
で終わるすべてのファイルをコピーするコマンドを作成します。.h
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
(現在のディレクトリ内のサブディレクトリであると仮定)。そうしないと、最終的に.seeからファイルが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
には-executable
テスト(ディレクトリが実行可能な場合はディレクトリは検索可能)と-readable
テストにGNUが必要です。
find
ここで、バリアントはファイルを通常のファイル(testパススルー)に制限しますが-type f
、このcp *.[ch]
メソッドはその2文字で終わるすべての種類のコンテンツをコピーします。また、このfind
ソリューションは隠しファイル(名前がドットで始まるファイル)をコピーしますが、最初のソリューションはデフォルトでこれらのタイプの名前と一致しません。