回答:
一部のシェルで高度なグロビングパターンを使用して、特定のパターンに一致するファイルを除いて、ディレクトリ内のすべてのファイルに一致させることができます。たとえば、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には、特にパターンに一致するファイルを除くすべてのファイルを移動するために使用できる一括コピー/移動/リンクコマンドがあります。たとえば、次のコマンドは、*.bak
from /source
を除くすべてのファイルをに移動し、プロセスのファイル名にtarget
追加.bak
します。
autoload zmv
zmv '/source/(*)~*.bak' '/target/$1.bak'
rename
浮動と呼ばれるいくつかのコマンドがあります。DebianおよびUbuntuでは、/usr/bin/rename
perl式によって生成された新しい名前にファイルを移動するperlスクリプトです。ファイルを除外する場合、新しい名前を生成しないことにより、ファイルの名前変更を除外できます。たとえば、次のコマンド(この特定のrename
プログラムを使用)は、*.bak
from /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
し、ファイル名を.bak
inに変更します。
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
があなたがそれをしたいことをしないと信じています