2012-09-25 8 views
6

すべてのファイルをあるディレクトリから別のディレクトリにコピーしようとしています。findを使用して同じサブディレクトリ構造を保持する拡張機能をコピーして削除するにはどうすればいいですか?

From directory 0001: 
0001/a/1.jpg 
0001/b/2.txt 

To directory 0002: 
0002/a/1 
0002/b/2 

私はいくつかの検索を試みました... | xargs c ...運がないp。

+0

拡張子以外に同じ名前の2つのファイル(例:1.txtと1.jpg)が同じディレクトリにある場合はどうすればよいですか。 –

+0

すべてのファイル名の前に一意のIDが付いているため、名前の衝突の危険はありません。 – user1345178

答えて

4

再帰コピーは、tarで本当に簡単です。あなたのケースでは:

tar -C 0001 -cf - --transform 's/\(.\+\)\.[^.]\+$/\1/' . | 
tar -C 0002 -xf - 
+0

+1 - あなたは正規表現を変更する必要があります:普遍的に拡張子を削除するだけでなく、(OPはそれを尋ねる) - しかし、そうでなければ、良い解決策。 – kobame

+1

この新しい正規表現は大丈夫ですが、これは例えば ".profile"というファイル名ではどうなりますか? – kobame

+0

良い解決策。 260000個のファイルでテスト(4時間)。 – user1345178

0

私はこの醜いアヒルの子を思い付いた:

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行目をコピーします。これの問題点は以下のとおりです。

  1. のみディレクトリと通常ファイル(なし シンボリックリンクなど)
  2. ( 拡張子以外の)任意の期間がある場合や特殊文字のためにあり処理している

    (スペースなど)をファイル名 に挿入すると、2番目のコマンドは機能しません。
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に必要なディレクトリツリーを作成するために
    • コマンドを(ターゲット・ディレクトリ修正/some/path/./other/dirのように(、いくつかの化粧品のパスの清掃を行って
  • sedをコピーする)
  • コマンド)
  • xargs
  • 行全体を取ると、シェル

で準備されたコマンドを実行する。しかし、それははるかに良くなるだろう:

  • 単に第一ステップ
  • 正確なコピーを作成します
  • 2番目のステップでファイルの名前を変更します。

もっと簡単で洗練された、より洗練された標的のサブディレクトリの世話/作成)!

+0

ディレクトリには約1000000個のファイルが含まれているので、私は2段階アプローチに興味があります。だからファスターは王様です。 – user1345178

+0

Milionファイル?したがって、この場合(IMO)、2つのパイプ付きタールが最適なソリューションです。 --transformでtarを実行していない場合は、ダウンロードしてコンパイルしてください。 milion cpコマンドを起動するよりも速くなります。 – jm666

1

はここにいくつかの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にすべてコピーされたファイルのパーミッションモードを変更します。

+0

+1これについて、私はそのような答えを書こうとしていました。最もエレガントなここと適切なツール:) – Zlatko

関連する問題