すべてのファイルをあるディレクトリから別のディレクトリにコピーしようとしています。findを使用して同じサブディレクトリ構造を保持する拡張機能をコピーして削除するにはどうすればいいですか?
From directory 0001:
0001/a/1.jpg
0001/b/2.txt
To directory 0002:
0002/a/1
0002/b/2
私はいくつかの検索を試みました... | xargs c ...運がないp。
すべてのファイルをあるディレクトリから別のディレクトリにコピーしようとしています。findを使用して同じサブディレクトリ構造を保持する拡張機能をコピーして削除するにはどうすればいいですか?
From directory 0001:
0001/a/1.jpg
0001/b/2.txt
To directory 0002:
0002/a/1
0002/b/2
私はいくつかの検索を試みました... | xargs c ...運がないp。
再帰コピーは、tar
で本当に簡単です。あなたのケースでは:
tar -C 0001 -cf - --transform 's/\(.\+\)\.[^.]\+$/\1/' . |
tar -C 0002 -xf -
+1 - あなたは正規表現を変更する必要があります:普遍的に拡張子を削除するだけでなく、(OPはそれを尋ねる) - しかし、そうでなければ、良い解決策。 – kobame
この新しい正規表現は大丈夫ですが、これは例えば ".profile"というファイル名ではどうなりますか? – kobame
良い解決策。 260000個のファイルでテスト(4時間)。 – user1345178
私はこの醜いアヒルの子を思い付いた:
find 0001 -type d | sed 's/^0001/0002/g' | xargs mkdir
find 0001 -type f | sed 's/^0001//g' | awk -F '.' '{printf "cp -p 0001%s 0002%s\n", $0, $1}' | sh
最初の行は、ファイルをディレクトリツリーを作成し、2行目をコピーします。これの問題点は以下のとおりです。
あなたがいないtar
--transform
と、このことができた作品がある場合:\
後
TRG=/target/some/where
SRC=/my/source/dir
cd "$SRC"
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" |\
sed 's:/\.::;s:/./:/:' |\
xargs -I% sh -c "%"
ないスペースは、行の簡単な終了を必要とするか、のような1行にそれに参加することができます。
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" | sed 's:/\.::;s:/./:/:' | xargs -I% sh -c "%"
説明:
find
はすべて通常のファイルを見つけるあなたの中に拡張子を持っているもの SRC(ソース)ディレクトリprintf
必要なシェルコマンド用意しております:TRGに必要なディレクトリツリーを作成するために
sed
をコピーする)xargs
はで準備されたコマンドを実行する。しかし、それははるかに良くなるだろう:
もっと簡単で洗練された、より洗練された標的のサブディレクトリの世話/作成)!
ディレクトリには約1000000個のファイルが含まれているので、私は2段階アプローチに興味があります。だからファスターは王様です。 – user1345178
Milionファイル?したがって、この場合(IMO)、2つのパイプ付きタールが最適なソリューションです。 --transformでtarを実行していない場合は、ダウンロードしてコンパイルしてください。 milion cpコマンドを起動するよりも速くなります。 – jm666
はここにいくつかのfind + bashのです+トリックを行いますそれをインストールします。
for src in `find 0001 -type f` # for all files in 0001...
do
dst=${src/#0001/0002} # match and change beginning of string
dst=${dst%.*} # strip extension
install -D $src $dst # copy to dst, creating directories as necessary
done
これは、のインストール--mode
オプションで変更可能、デフォルトでrwxr-xr-x
にすべてコピーされたファイルのパーミッションモードを変更します。
+1これについて、私はそのような答えを書こうとしていました。最もエレガントなここと適切なツール:) – Zlatko
拡張子以外に同じ名前の2つのファイル(例:1.txtと1.jpg)が同じディレクトリにある場合はどうすればよいですか。 –
すべてのファイル名の前に一意のIDが付いているため、名前の衝突の危険はありません。 – user1345178