ディレクトリにファイルをコピーするときに問題があります。
多くのディレクトリに.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
ファイルのみが必要です
ディレクトリ内のすべての.txt
ファイルをコピーする場合は、 ワイルドカードパターン を使用します。
cp direct/direct1/*.txt target
これにより、ディレクトリ.txt
にあるすべてのdirect/direct1
ファイルがディレクトリtarget
(すでに存在している必要があります)にコピーされます。
複数のパターンを渡して、複数のディレクトリからファイルをコピーできます。
cp direct/direct1/*.txt direct/direct2/*.txt target
direct
のすべてのサブディレクトリから.txt
ファイルをコピーする場合は、ディレクトリにもワイルドカードを使用できます。
cp direct/*/*.txt target
特定のディレクトリからのみコピーする場合は、これらのディレクトリのみに一致するワイルドカードパターンを使用できます。たとえば、direct
にfoo
、bar
、baz
、qux
の4つのサブディレクトリがあり、bar
とbaz
からのみファイルをコピーする場合は、
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
自体にコピーされることに注意してください。これはディレクトリ構造を再現しません。ディレクトリ構造を再現する場合は、 rsync ( tutorial )や 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
が呼び出される方法によって適切に区切られます。