web-dev-qa-db-ja.com

特定のタイプのすべてのファイルをUnixのディレクトリに移動(またはコピー)するにはどうすればよいですか?

grep/find/awk/xargsのすべてのトリックにはまだあまり詳しくありません。

特定のパターンに一致するファイルがいくつかあります(*.xxxなど)。これらのファイルは、特定のディレクトリ全体のランダムな場所にあります。このようなファイルをすべて見つけて、UNIXのホームディレクトリのフォルダに移動するにはどうすればよいですか(まだ存在しない可能性があります)。

22
qodeninja
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;
22
Kevin

ディレクトリ階層内のすべてのファイルを単一の宛先ディレクトリに移動する場合は、bash≥4(shopt -s globstar~/.bashrcを置く)またはzshで:

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

他のシェルでは:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

このfindコマンドの読み方:

  • .:現在のディレクトリをたどります
  • -name '*.xxx':このパターンに一致する名前のファイルに作用します
  • -exec … \;:各ファイルに対してこのコマンドを実行し、{}をファイルへのパスに置き換えます

findを使用するより複雑なコマンドがあります。ファイルごとに個別のmvプロセスを呼び出す必要がないため、多くのファイルがある場合は高速です。

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

最後の+は、findに一度に複数のファイルに対してコマンドを呼び出すように指示します。 findはファイル名をコマンドラインの最後にのみ置くことができ、mvは宛先ディレクトリを最後に置く必要があるため、中間シェルを使用して引数を再配置します("$0"はシェルの最初の引数、~/new-directory、および"$@"find{}の展開から取得される後続の引数です)。

一致するソースファイルのディレクトリ構造を新しいターゲットディレクトリに複製する場合は、GNU cp's -parentsオプションを使用できます。

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +
4
frielp

‍‍-exec‍なしでfindを使用することもできます。

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest
3
Ken Zein