1. 序章

Linuxを使用している場合、複数のファイルを移動して1つ以上のファイルを除外する必要がある場合があります。 この記事では、そのような結果を達成するためのいくつかの方法を見ていきます。

2. ブルートフォースまたは文字通りのアプローチ

総当たり攻撃または文字通りのアプローチから始めましょう。 簡単に言うと、 mv コマンドの後に、不要なファイルを除いて、再配置するすべてのファイルを一覧表示します。 基本的に、mvコマンドを最も基本的な形式で使用します。 したがって、不要なファイルを分離する手法を使用せずに、文字通り必要なファイルを転送します。これには、少なくともファイルのソースディレクトリ内で操作する必要があります。

/source_dir$ ls
file1  file2  file3  file4  file5
/source_dir$ mv file1 file2 file3 file4 ~/target_dir/
/source_dir$ ls ~/target_dir/
file1  file2  file3  file4

この方法は非効率に見えるかもしれませんが、ただし、移動するファイルが不要なよりも1つまたは少ない場合や、正規表現が不適切または複雑になる場合に便利です。

3. 不要なファイルの名前を変更する

次に、mvはデフォルトで隠しファイルを検出しないため、不要なファイルの名前を隠しファイルに変更できます。 したがって、不要なファイルの名前を変更した後、アスタリスク * の正規表現を使用して、残りのファイルを移動します。

/source_dir$ mv file5 .file5
/source_dir$ mv * ~/target_dir/
/source_dir$ ls -la
total 0
drwxrwxr-x  2 ubuntu ubuntu  60 Jun 10 03:42 .
drwxr-xr-x 21 ubuntu ubuntu 520 Jun 10 03:25 ..
-rw-rw-r--  1 ubuntu ubuntu   0 Jun 10 00:57 .file5

ファイルを移動した後、隠しファイルの名前を元の名前に変更できます。

/source_dir$ mv .file5 file5

4. 感嘆否定形式の使用

3番目のアプローチは、括弧で囲まれた不要なファイル名の前のプレフィックスとして感嘆符を使用します。 これは、で示されているファイルを除く他のすべてのファイルを探すようにオペレーティングシステムに指示します。

$ mv SOURCE_DIRECTORY/!(unwanted_filename) TARGET_DIRECTORY

この形式を使用するには、最初に shopt -sextglobコマンドを.bashrc構成ファイルに追加する必要があります。 これは、パス名拡張でパターンマッチングを許可するようにLinuxに指示します。

$ set shopt -s extglob .bashrc
$ mv source_dir/!(file5) target_dir/

5. キャレット否定形式の使用

4番目のアプローチは、感嘆否定形式に非常によく似ています。 このアプローチでは、不要なファイルの前にキャレット^を配置し、再配置する他のファイルからそのファイルを分離します

% mv SOURCE_DIRECTORY/^UNWANTED_FILENAME TARGET_DIRECTORY

ただし、この方法の使用には制限があります。 まず、このメソッドはzシェルzshでのみ機能します。 次に、拡張グローバルシェルオプションEXTENDED_GLOB 設定する必要があります。つまり、コマンドラインから setoptextended_globを実行します。 上記のshopt-s extglob と同様に、これはLinuxにパス名拡張でのパターンマッチングを許可するように指示します。 これらのプロトコルを配置したら、不要なファイルの前にプレフィックスとしてキャレットを配置します。 mv コマンドは、不要なファイルを除いて、他のすべてのファイルを転送します。

$ zsh
% setopt extended_glob
% mv source_dir/^file5 target_dir

6. 囲まれた検索またはパイプされた反転検索の使用

これらの次のサブトピックでは、 backticks sub-shells $()[内の不要なファイルの分離を評価した後のターゲットファイルの転送について説明します。 X173X]、または xargs-i操作を介してパイプされます。 バックティックとサブシェルは、コマンドステートメントを評価する囲まれたシェル環境を作成します。同じコマンドライン内の他のコマンドは、囲まれたステートメントの結果を操作に使用します。 これはコマンド置換です。

xargs -i 操作にパイプされると、 xargsは標準入力からコンテンツを収集し、同じステートメント内の注目のコマンドで利用できるようにします。 -iオプションは切り捨てられますまたは入力セパレータを置き換えます。 したがって、空白の区切り文字は、結果の入力内のコンテンツを区切る改行またはスペースを置き換えます。 xargs -i 操作は、 mv{}ステートメントを特徴としています。 中括弧{}は、 xargs-iステートメントにパイプされた結果のリストを展開します。

6.1. 逆ls検索の使用

この方法では、lsコマンドと-Iオプションを使用して、不要なファイルをインデックスとして逆検索を実行します。 This は、不要なファイルを除く他のすべてのファイルを表示します。 このコマンドステートメントは、囲まれたバッククォート内で評価されます。 次に、 mv コマンドは、囲まれた操作の結果をターゲットディレクトリに転送します。 この方法を機能させるには、ファイルのソースディレクトリにいる必要があります。

/source_dir$ mv `ls -I file5` ~/target_dir/

バックティックの代わりに、サブシェルを使用して囲むことができます。

/source_dir$ mv $(ls -I file5) ~/target_dir/

ls-I unwanted_filenameからの結果をxargs-iステートメントにパイプすることもできます。これにより、逆検索の結果がターゲットディレクトリに転送されます。

/source_dir$ ls -I file5 | xargs -i mv {} ~/target_dir/

6.2. 逆grep検索の使用

この方法は ls ソースディレクトリの内容を一覧表示し、パイプでつなぐ grep -v 逆検索を実行します。 grep -v検索では、不要なファイルをインデックスとして使用して、他のすべてのファイルを一覧表示します。 ここで、バックティックがこのパイプ操作全体を囲み、評価します。 その後、mvコマンドはファイルを転送しますバックティックで囲まれた操作からターゲットディレクトリにリストされます。

/source_dir$ mv `ls | grep -v file5` ~/target_dir/

バックティックの代わりに、サブシェルを使用して囲むことができます。

/source_dir$ mv $(ls | grep -v file5) ~/target_dir/

grep-vを反転した結果をxargs-iステートメントにパイプすることもできます。これにより、反転検索の結果がターゲットディレクトリに転送されます。

/source_dir$ ls | grep -v file5 | xargs -i mv {} ~/target_dir

6.3. findを逆grep検索で使用する

この手法では、 find コマンドを使用して、ソースディレクトリの内容を一覧表示します。 通常のファイルのみを検索するようにfindコマンドに指示するタイプのf引数があります。 次に、の結果は、不要なファイルをインデックスとして使用して他のすべてのファイルを一覧表示する逆grep検索にパイプされます。バックティックは、この操作全体を囲んで評価します。 次に、 mv コマンドは、囲まれた操作の結果をターゲットディレクトリに転送します。

$ mv `find source_dir/ -type f | grep -v file5` target_dir/

バックティックの代わりに、サブシェルを使用して囲むことができます。

$ mv $(find source_dir/ -type f | grep -v file5) target_dir/

find/grep検索の結果をxargs-iステートメントにパイプすることもできます。これにより、逆検索の結果がターゲットディレクトリに転送されます。

$ find source_dir/ -type f | grep -v file5 | xargs -i mv {} target_dir/

注:このメソッドは、事前のセットアップ、監視するプロトコルがなく、ソースディレクトリにある必要もないため、スクリプト内で安全に使用できます。

6.4. sedの検索と置換の使用

このメソッドは、バッククォートを使用して sed ステートメントを囲み、不要なファイルを検索して、その表示をnullエントリに置き換えます。 その後、その検索はパイプで戻されますソースディレクトリの他のすべての内容を一覧表示するechoコマンド。 したがって、不要なものを除いて、他のすべてのファイルがリストされています。 その後、 mv コマンドは、リストされたコンテンツの結果をターゲットの場所に転送します。

/source_dir$ mv `echo * | sed s:file5::g` ~/target_dir/

バックティックの代わりに、サブシェルを使用して囲むことができます。

/source_dir$ mv $(echo * | sed s:file5::g) ~/target_dir/

mv{}ステートメントを特徴とするxargs-iを介して、sed検索と置換操作をパイプ処理することもできます。 中括弧を含める必要があります、 {} 、 の間に xargs -i mv {} パイプエコーとして/ sed ステートメントは文字列を生成します。 評価するには、mvの文字列を展開する必要があります。 次に、 mv コマンドに指定された中括弧は、新しく展開されたコンテンツを評価します。

/source_dir$ echo * | sed s:file5::g | xargs -i {} mv {} ~/target_dir/

6.5. findコマンドをxargsで使用する

最後に、findコマンドをxargsコマンドと一緒に使用できます。 この方法は、事前の設定やプロトコルがなく、ソースディレクトリにある必要もないため、スクリプト内で安全に使用できるもう1つの手法です。 findコマンドは、xargs操作を介してソースディレクトリの内容を一覧表示および移動するために使用されます。

find コマンドには、いくつかのオプションがあります。 1つ目は-maxdepth1で、他のフォルダーへの繰り返しを禁止します。 2つ目は-mindepth1で、転送される結果にソースフォルダーが含まれないようにします。 3番目のオプションは-not-namedesanted_filenameオプションで、不要なファイル名をインデックスとして使用して残りのコンテンツを一覧表示します。 4番目はオプションtype-f で、リストされた結果にファイルのみが含まれます。 最後に、 -print0 オプションを使用して、ヌル文字で区切られたリストを作成し、空白や引用符を削除します。

次に、リストはファイル名のリストを収集し、mv-tを使用してそれらをターゲットディレクトリに転送するxargs-0操作にパイプされます

$ find source_dir/ -maxdepth 1 -mindepth 1 -not -name file5 -type f -print0 | xargs -0 mv -t target_dir/

xargsが標準入力からコンテンツを収集することはすでに知っています。 オプション-0は、ヌル文字が入力を区切るために指定されます。したがって、-print0オプションのために使用されます。 mv -t は、基本的に、ソースコンテンツをターゲットディレクトリに転送するように指示します。

xargs -0 を削除し、バッククォートを使用して -print0なしでfind操作を囲むことができます。これは、結果を区切るためにヌル文字を使用する必要がないためです。 mv コマンドを使用して、結果をターゲットディレクトリに送信します。

$ mv `find source_dir/ -maxdepth 1 -mindepth 1 -not -name file5 -type f` target_dir/

さらに、バックティックの代わりに、サブシェルを使用してfind操作を囲むことができます。

$ mv $(find source_dir/ -maxdepth 1 -mindepth 1 -not -name file5 -type f) target_dir/

7. 結論

この記事では、不要なファイルを除いて、あるディレクトリから別のディレクトリにファイルを移動するためのいくつかの手法について説明しました。 最初に文字通りのアプローチに注目し、その後、検出できない隠しファイル形式の不要なファイルの名前を基本的なmvコマンド形式に変更しました。 次に、感嘆符とキャレット否定を使用して不要なファイルを分離する方法を検討しました。

次に、バックティックサブシェル、 、または xargs -i操作にパイプされ、mvを使用して評価された逆検索アプローチを調べました。 ]結果を転送するコマンド。 これらには、 sed の検索と置換の方法、および find コマンドを使用して不要なファイルを分離し、他のフォルダーへの繰り返しがないことを確認し、親フォルダーを含まない最終的なアプローチが含まれていました。リストされた結果。 次に、これらの結果は xargs -0 操作にパイプされ、 mv -t コマンドを使用してファイルを転送するか、バックティックまたはサブシェル内で評価され、mvによって転送されました。 コマンド。