web-dev-qa-db-ja.com

.txtファイルを特定のディレクトリにコピーする

ディレクトリにファイルをコピーするときに問題があります。

多くのディレクトリに.txtファイルと.jpegファイルがあり、ディレクトリに従って.txtファイルのみをコピーしたい。たとえば、私はこれを持っています:

direct/direct1
direct/direct2

direct1:
 file.txt
 file2.txt
 file.jpeg
 file2.jpeg

direct2:
 file3.txt
 file4.txt
 file3.jpeg
 file4.jpeg

私のコピーコマンドでは、各ディレクトリの.txtファイルのみが必要です

2
toto

ディレクトリ内のすべての.txtファイルをコピーする場合は、 ワイルドカードパターン を使用します。

cp direct/direct1/*.txt target

これにより、ディレクトリ.txtにあるすべてのdirect/direct1ファイルがディレクトリtarget(すでに存在している必要があります)にコピーされます。

複数のパターンを渡して、複数のディレクトリからファイルをコピーできます。

cp direct/direct1/*.txt direct/direct2/*.txt target

directのすべてのサブディレクトリから.txtファイルをコピーする場合は、ディレクトリにもワイルドカードを使用できます。

cp direct/*/*.txt target

特定のディレクトリからのみコピーする場合は、これらのディレクトリのみに一致するワイルドカードパターンを使用できます。たとえば、directfoobarbazquxの4つのサブディレクトリがあり、barbazからのみファイルをコピーする場合は、

cp direct/ba?/*.txt target

これまでの例では、direct自体から、またはdirectのサブサブディレクトリからファイルをコピーしていません。 directから.txtファイルをコピーする場合は、リストに含める必要があります。

cp direct/*.txt direct/*/*.txt target

direct、そのすべてのサブディレクトリ、そのすべてのサブディレクトリなどからファイルを再帰的にコピーする場合は、シェルがサポートしていれば、**ワイルドカードを使用できます。 zshではそのまま使用できますが、 bash では、最初にshopt -s globstarを使用して有効にする必要があります。

cp direct/**/*.txt target

すべてのファイルがtarget自体にコピーされることに注意してください。これはディレクトリ構造を再現しません。ディレクトリ構造を再現する場合は、 rsynctutorial )や pax などの別のツールが必要です。

rsync -am --include='*.txt' --include='*/' --exclude='*' direct/ target/
cd direct && pax -rw -pe -s'/\.txt$/&/' -s'/.*//' . target/

findを使用して、いくつかのディレクトリの下から `.txtファイルのみを選択できます。

find direct/direct? -name "*.txt"

これによりすべてのファイルが出力されるので、必要なものが得られたことを確認でき、あまり選択されていないことを確認できます。 *.txtは引用符で囲む必要があります。引用符がない場合、シェルはこれを現在のディレクトリの.txtファイルに展開しようとします。

コピーに関しては、(ほとんどの場合)2つのことの1つを行います:.txtファイルへの直接パスを保存するかどうか。それを維持するために:

find direct/direct? -name "*.txt" -print0 | cpio -pdmv0 target_directory

すべての.txtファイルを1つのターゲットディレクトリにコピーするには、@ lambertの提案に似たものを使用します。

find direct/direct? -name "*.txt" -exec cp {} target_directory +

cpを呼び出す代わりに+を使用すると、複数のファイル名が単一のcpに渡されるため、\;の代わりに+を使用する方が効率的です。 \;使用時のすべての単一ファイル)

2番目のコマンドの場合、-print0は、特殊文字を含むパスを処理する必要はありません。{}を置き換えるファイル名は、cpが呼び出される方法によって適切に区切られます。

2
Anthon