GNU/Linux >> Linux の 問題 >  >> Linux

ターミナルlinux mintを使用してディレクトリ内のすべての画像を見つけてコピーし、構文を理解しようとします

まず、パイプ「|」リンク コマンドは、最初の出力を引数として 2 番目のコマンドにパイプします。 2 つのシェル コードは両方とも、find コマンドの出力を他のコマンド (grep と xargs) にパイプします。これらのコマンドを 1 つずつ見ていきましょう:

最初のコマンド:検索

find は、「ディレクトリ階層内のファイルを検索する」プログラムです (find の man ページからの説明です)。構文は(この場合)

find <search directory> <search pattern> <action>

どちらの場合も、検索ディレクトリは . (これが現在のディレクトリです)。現在のディレクトリだけでなく、そのすべてのサブディレクトリ (ディレクトリ階層) も検索することに注意してください。

検索パターンは、オプション -name (このオプションの引数として指定されたパターンと一致する名前のファイルを検索することを意味します) または -iname (名前と同じですが、大文字と小文字を区別しません) などのオプションを受け入れます。

アクション パターンは -print0 (指定された検索ディレクトリ内の位置を含む正確なファイル名、つまりファイルへの相対パスまたは絶対パスを出力する) または -exec (ファイルに対して指定されたコマンドを実行する、コマンドは";" で終了し、"{}" のすべてのインスタンスはファイル名に置き換えられます)。

つまり、最初のシェル コード (最初の部分、パイプの左側)

find . -iname \*.jpg -print0 

現在のディレクトリ階層で「.jpg」で終わるすべてのファイルを検索し、それらのパスと名前を出力します。 2 つ目 (前編)

find . -name '*' -exec file {} \; 

現在のディレクトリ階層内のすべてのファイルを検索して実行します

file <filename>

それらの上に。 File は、ファイルの種類を判別して出力する別のコマンドです (詳細については、man ページを参照してください。man file)。

2 番目のコマンド:xargs

xargs は、「標準入力 (man xargs) からコマンド ラインを構築および実行する」コマンドです。つまり、xargs にパイプされた検索出力からです。ビルドして実行するコマンドはこの場合です

cp -v {} /home/joachim/neu2"

オプション -I{} は置換文字列を定義します。つまり、コマンド内の {} のすべてのインスタンスは、ファイルから取得した入力 (つまり、ファイル名) に置き換えられます。オプション -0 は、入力項目が空白または改行で終了 (分離) されず、ヌル文字のみで終了することを定義します。これは、find 出力を xargs 入力として処理する標準的な方法を使用する場合に必要と思われます。

ビルドされて実行されるコマンドはもちろん、オプション -v (verbose) を指定した copy コマンドであり、find から取得した各ファイル名をディレクトリにコピーします。

3 番目のコマンド:grep

grep は入力をフィルタリングして、特定の出力パターンに一致する行または文字列のみを提供します。オプション -o は、行全体ではなく、一致する文字列のみを出力するように grep に指示します (man grep を参照)。 -P は、次のパターンを perl 正規表現パターンとして解釈するように指示します。 perl regex では、^ は行の先頭、.+ は任意の文字列です。この任意の文字列の後には、コロン、スペース、いくつかの英数字 (perl regex では \w+ と示されます)、スペース、および文字列が続きます。 "画像"。基本的に、この grep コマンドはファイル出力をフィルタリングして、画像ファイルであるファイル名のみを出力します。 (たとえばここで perl 正規表現について読んでください:http://www.comp.leeds.ac.uk/Perl/matching.html )

本当に欲しかったコマンド

ここでやりたいことは、(1) 2 番目のシェル コマンドの出力 (イメージ ファイルをリストする) を取得し、(2) 適切な形式に変換し、(3) 最初のシェル コマンドから xargs コマンドにパイプすることです。行 (その後、必要なコピー コマンドをビルドして実行します)。今回は、2 つのパイプを使用した 3 (実際には 4) ステージのシェル コマンドがあります。問題ない。ステージ (1) と (3) は既にあります (ただし、ステージ (3) では、入力が検索出力でなくなったため、-0 オプションを省略する必要があります。改行を項目セパレータとして扱うために必要です)。

ステージ (2) はまだありません。これには cut コマンドを使用することをお勧めします。 cut は、文字列 py を変更して、それらを (元の文字列の区切り文字で区切られた) 異なるフィールドに分割し、後で再配置できるようにします。区切り文字として「:」を選択し (これにより、grep 出力のファイル名が終了します。オプション -d':')、最初のフィールドのみを提供するように指示します (オプション -f1、要点:ファイル名のみを出力し、ファイル名は出力しません)。 ":" の後に来る部分)、つまりステージ (2) は次のようになります

cut -d':' -f1

そして、必要なコマンド全体は次のようになります:

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2

たとえば、ここですべてのマニュアルページを見つけることができることに注意してください:http://www.linuxmanpages.com


Linux
  1. Linuxですべてのファイルとディレクトリ名を小文字に変更

  2. Linuxで特定の種類のファイルを検索してあるディレクトリから別のディレクトリにコピーする方法

  3. Linuxでディレクトリとフォルダを削除する方法は?

  1. LinuxでSed、ex、perlコマンドを使用してテキストを検索および置換する

  2. Linuxは、ディレクトリに関連するすべてのシンボリックリンクを見つけて削除しますか?

  3. Linux で find コマンドを使用して、スペースのあるファイルを検索して削除する

  1. Bash を使用してファイルを検索してコピーする

  2. Linux ターミナルでのディレクトリの検索

  3. Linuxシェルでcpコマンドを使用して、ディレクトリ全体を別のディレクトリにコピーするにはどうすればよいですか?