ファイルを再帰的にコピーして名前を変更する

ファイルを再帰的にコピーして名前を変更する

私の入力フォルダにサブフォルダなどがfiles_input含まれていて、これらのすべてのサブフォルダに別のサブフォルダがある場合。各サブフォルダーに。01-201502-201503-2015index.html

これらすべてのファイルを同じフォルダ内の別々のファイルのように見えるようにというindex.htmlフォルダにコピーするにはどうすればよいですか?files_outputもちろん、名前を変更する必要があります。そのために --backup を使ってみました。

頑張りました

find files_input -name \*.html -exec cp --backup=t '{}' files_output \;

番号を付けてファイルを1つだけコピーし、他のファイルをコピーしないでください。

これがどのように変わるのかわかりませんが、zshを使用しており、バージョンは次のようになります。

   $ zsh --version | head -1
   zsh 5.0.2 (x86_64-pc-linux-gnu)
   $ bash --version | head -1
   GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
   $ cp --version | head -1
   cp (GNU coreutils) 8.21
   $ find --version | head -1
   find (GNU findutils) 4.4.2

アイデアはありますか?

編集する:

たとえば、次のようにします。

cp --backup=t files_input/01-2015/index.html files_output

5回連続してfiles_outputフォルダにindex.htmlが表示されます! CPが故障しましたか? 5つの異なるファイルがないのはなぜですか?

答え1

zshユーザーがユーザーの場合:

$ tree files_input
files_input
|-- 01_2015
|   |-- subfolder-1
|   |   `-- index.html
|   |-- subfolder-2
|   |   `-- index.html
|   |-- subfolder-3
|   |   `-- index.html
|   |-- subfolder-4
|   |   `-- index.html
|   `-- subfolder-5
|       `-- index.html
|-- 02_2015
|   |-- subfolder-1
|   |   `-- index.html
|   |-- subfolder-2
|   |   `-- index.html
|   |-- subfolder-3
|   |   `-- index.html
|   |-- subfolder-4
|   |   `-- index.html
|   `-- subfolder-5
|       `-- index.html
(etc.)
$ mkdir -p files_output
$ autoload -U zmv
$ zmv -C './files_input/(*)/(*)/index.html' './files_output/$1-$2-index.html'
$ tree files_output
files_output
|-- 01_2015-subfolder-1-index.html
|-- 01_2015-subfolder-2-index.html
|-- 01_2015-subfolder-3-index.html
|-- 01_2015-subfolder-4-index.html
|-- 01_2015-subfolder-5-index.html
|-- 02_2015-subfolder-1-index.html
|-- 02_2015-subfolder-2-index.html
(etc.)

ここで何が起こるのかは、コマンドをzmv使用できるようにすることですautoload -U zmv。このコマンドは、一致するファイルの名前を変更、コピー、またはリンクするために使用されます。zsh 拡張ワイルドカードパターン

私たちはオプションを使ってzmv教えてくれ-Cます。コピーファイルを移動する代わりに(デフォルト)。次に、コピーするファイルと一致するパターンを指定します./files_input/(*)/(*)/index.html。どちらも(*)ステップ2サブディレクトリ名と一致し、各ファイルの新しい名前に使用できるように括弧内に入れます。各ファイルの新しい名前は2番目の引数です。./files_output/$1-$2-index.htmlここ$1$2、およびはパターンの角かっこでキャプチャされた文字列です(たとえば、サブディレクトリ名の逆参照)。どちらのパラメータも一重引用符で囲む必要があります。

答え2

次のことができます。

cd -P files_input/.. &&
mkdir files_output   &&
pax -rws'|.*/\(.*\)/\(.*\)|\1.\2|' \
     files_input/??-2015/index.html files_output

これは世界中ですべてですindex.htmlサブディレクトリのフォルダ内のファイル./files_input2文字、ダッシュ、文字列で名前を付けます。2015これらすべてのファイルが新しく作成されましたfiles_output同様の名前のフォルダ??-2015.index.html

答え3

{}私に合うように見える周囲の引用符を削除してみてください。

$ find foo* files_output -ls
 27002    0 drwxrwxr-x   2 steve    steve          60 Jul  2 15:04 foo1
 25373    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:04 foo1/index.html
 27003    0 drwxrwxr-x   2 steve    steve          60 Jul  2 15:04 foo2
 25374    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:04 foo2/index.html
 48941    0 drwxrwxr-x   2 steve    steve          40 Jul  2 15:06 files_output
$ find foo* -name index.html -exec cp --backup=t {} files_output \;
$ find files_output -ls
 48941    0 drwxrwxr-x   2 steve    steve          80 Jul  2 15:08 files_output
 51354    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:08 files_output/index.html
 49595    0 -rw-rw-r--   1 steve    steve           0 Jul  2 15:08 files_output/index.html.~1~
$

私の場合、ユーティリティのバージョンは次のようになりました。

$ bash --version | head -1
GNU bash, version 4.2.53(1)-release (x86_64-redhat-linux-gnu)
$ cp --version | head -1
cp (GNU coreutils) 8.21
$ find --version | head -1
find (GNU findutils) 4.5.11
$

答え4

これは私にとって効果的です。

find files_input -name "\20171123*" -exec cp --backup=t --target-directory=files_output {} +

'files_input'のディレクトリとサブディレクトリのパターンに一致するすべてのファイルを-name'file_output'ディレクトリにコピーし、〜1〜、〜2〜などを追加してファイルを複製します。

関連情報