grep/find/awk/xargs
のすべてのトリックにはまだあまり詳しくありません。
特定のパターンに一致するファイルがいくつかあります(*.xxx
など)。これらのファイルは、特定のディレクトリ全体のランダムな場所にあります。このようなファイルをすべて見つけて、UNIXのホームディレクトリのフォルダに移動するにはどうすればよいですか(まだ存在しない可能性があります)。
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;
ディレクトリ階層内のすべてのファイルを単一の宛先ディレクトリに移動する場合は、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 {} +
-exec
なしでfindを使用することもできます。
mkdir /path/to/dest
cp `find /path/to/source -name "*.jar"` /path/to/dest