コマンドラインmv除外リスト


11

する方法があるmvcpまたは私はすべてのファイルを指定することができるような任意のファイル操作していない影響を受けたいの?

例えば、私は、ファイルとフォルダを持っていると言うfile1file2file3、と私は移動するfile1file2どこか。移動するファイルに明示的に名前を付けるのではなく(mv file1 file2 /path/to/destination)、移動しないファイルに名前を付けて、フォルダー内の他のすべてのファイルを移動させます(mv --some-switch file3 /path/to/destination


私はそれmv file1 file2 /path/to/destinationがあなたがそれをしたいことをしないと信じています
phunehehe

回答:


19
  • 一部のシェルで高度なグロビングパターンを使用して、特定のパターンに一致するファイルを除いて、ディレクトリ内のすべてのファイルに一致させることができます。たとえば、ksh、bash、またはzshでは、コマンド

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    

    は、に一致するファイル/source/destination除くすべてのファイルをに移動します*.bak。zshでは、/source/^*.bak最初にを実行したsetopt extended_glob場合、より一般的には(再度を要求するsetopt extended_glob/source/*~*.bak(または/source/a*~*.bakファイルをa除いて名前が始まるすべてのファイル.bakなど)を書き込むこともできます。

  • Zshには、特にパターンに一致するファイルを除くすべてのファイルを移動するために使用できる一括コピー/移動/リンクコマンドがあります。たとえば、次のコマンドは、*.bakfrom /sourceを除くすべてのファイルをに移動し、プロセスのファイル名にtarget追加.bakします。

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • rename浮動と呼ばれるいくつかのコマンドがあります。DebianおよびUbuntuでは、/usr/bin/renameperl式によって生成された新しい名前にファイルを移動するperlスクリプトです。ファイルを除外する場合、新しい名前を生成しないことにより、ファイルの名前変更を除外できます。たとえば、次のコマンド(この特定のrenameプログラムを使用)は、*.bakfrom /sourceを除くすべてのファイルをtoに移動します/target

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • findコマンドを使用して、移動するファイルを選択できます。たとえば、次のコマンドは、サブディレクトリ*.bak/sourceまたはサブディレクトリ以外のすべての通常のファイルを移動します/target(ディレクトリ構造は省略されています)。

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    

    または(移動するファイルが多い場合はより効率的です)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
  • rsync一般化されcp及びscp/ルールを除外する非常に強力であります。たとえば、次のコマンドは、ディレクトリ構造に従って*.bak/sourceまたはサブディレクトリを除くすべてのファイルをにコピーします/target

    rsync -a --exclude '*.bak' /source/ /target/
    
  • pax(とりわけ)cpステロイドに関する別のものです。その除外ルールはrsyncほど強力ではありませんが、コピー時にファイルの名前を変更する追加機能があります。ファイルの名前を空の文字列に変更すると、そのファイルはコピーから除外されます。たとえば、次のコマンド*.bakは、/sourceまたはサブディレクトリを除くすべてのファイルをにコピー/targetし、ファイル名を.bakinに変更します。

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    

    上記の例では、と呼ばれるディレクトリを作成する不幸な副作用有するfoo.bak組み合わせることによって回避することができる、findとしますpax

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    

驚くばかり。考えられる修正の1つ:findコマンドは次のように終了する必要があると思います\;
Steven D

@Steven:ありがとう、+すぐにしか使用できないことを忘れてしまいます{}
Gilles「SO-邪悪なことをやめよ」

素敵なリスト、そのためのthx。:-)
echox

1
なんという答えだ、大きな親指:)
Dzung Nguyen 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.