
すべてのファイルを指定する方法やファイル操作方法はmv
ありますか?cp
いいえ影響を受けたいですか?
たとえば、ファイルを含むフォルダfile1
があり、どこかに移動したいとします。移動したいファイルの名前を明示的に指定する代わりに()ファイル名を指定したいと思います。file2
file3
file1
file2
mv file1 file2 /path/to/destination
いいえフォルダ(mv --some-switch file3 /path/to/destination
)の他のすべての項目を移動して移動します。
答え1
一部のシェルでは、拡張ワイルドカードパターンを使用して、特定のパターンと一致するファイルを除いてディレクトリ内のすべてのファイルを一致させることができます。たとえば、ksh、bash、またはzshでは、次のコマンドを使用します。
shopt -s extglob ## needed in bash only setopt ksh_glob ## needed in zsh only mv /source/!(*.bak) /destination
一致するファイルを
/source
除くすべてのファイルを移動します。 zsh では if to run first を作成することも、より一般的に再度必要な場合 (または名前が Except files などで始まるすべてのファイルに対して) 作成することもできます。/destination
*.bak
/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'
floatというコマンドがいくつかあります
rename
。 DebianとUbuntuで/usr/bin/rename
Perl式によって生成された新しい名前にファイルを移動するPerlスクリプト。ファイルを除外する場合は、新しい名前を生成しないことでファイル名の変更を除外できます。たとえば、次のコマンド(この特定のプログラムを使用)は、rename
fromを除くすべてのファイルを次に移動します。*.bak
/source
/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
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/