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


22

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

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


4
「ファイルの種類」について話すときは注意が必要です。unixy環境では、「。xxx」の例はWindowsの意味では拡張機能ではありません。「.xxx」は、ファイル名のサフィックスを構成するだけです。「ファイルタイプ」は、通常のファイル、デバイスファイル、シンボリックリンク、ディレクトリ、名前付きパイプ、Unixファミリソケットなど、いくつかのカテゴリのうちの1つです。
ブルースエディガー


@BruceEdigerおかげで私は本当に「ファイル名パターン」を意味していたと思う
-qodeninja

回答:


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

1
私は使用しますmv -i -t ~/dst {} +
enzotib

17

あなたは(プットを≥4bashで、単一の宛先ディレクトリにディレクトリ階層内のすべてのファイルを移動したい場合は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の拡張{})。


4

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

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

3

あなたはせずにFindを使用することができ-exec‍、同様:

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

1
ただし、find -execはるかに安全であることに注意してください。たとえば、空白を含むファイル名では上記は失敗します。
dhag
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.