私の入力フォルダにサブフォルダなどがfiles_input
含まれていて、これらのすべてのサブフォルダに別のサブフォルダがある場合。各サブフォルダーに。01-2015
02-2015
03-2015
index.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_input
2文字、ダッシュ、文字列で名前を付けます。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〜などを追加してファイルを複製します。