回答:
一部のシェルで高度なグロビングパターンを使用して、特定のパターンに一致するファイルを除いて、ディレクトリ内のすべてのファイルに一致させることができます。たとえば、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/
findコマンドは次のように終了する必要があると思います\;
+すぐにしか使用できないことを忘れてしまいます{}。
mv file1 file2 /path/to/destinationがあなたがそれをしたいことをしないと信じています