grep/find/awk/xargs
まだすべての技術に精通していません。
特定のパターンに一致するファイルがあります(例:)*.xxx
。このファイルは、いくつかのディレクトリの任意の場所にあります。これらのファイルをすべて見つけて、Unixのホームディレクトリ(まだ存在しない場合があります)にあるフォルダに移動するにはどうすればよいですか?
答え1
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;
答え2
ディレクトリ階層内のすべてのファイルを単一のターゲットディレクトリに移動するには、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
を拡張したものです{}
)。 。
答え3
ソースファイルと一致するディレクトリ構造を新しいターゲットディレクトリにコピーするには、GNU cp- 親オプション:
mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +
答え4
あなたも-exec
:
mkdir /path/to/dest
cp `find /path/to/source -name "*.jar"` /path/to/dest