Rename

帶重命名的遞歸複製文件

  • April 12, 2020

如果我的輸入文件夾files_input包含01-2015,等子文件夾02-201503-2015並且所有這些子文件夾都有其他子文件夾。每個子文件夾只有一個名為index.html.

如何將所有這些index.html文件複製到一個名為的文件夾files_output中,以便它們最終像同一文件夾中的單獨文件一樣。它們當然應該重命名,我已經嘗試使用 –backup 來實現它……

我試過了

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

讓它們編號,但只複製一個文件而不複製其他文件。

我不知道這會改變什麼,但我使用的是 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

連續五次仍然給我一個 index.html 在files_output文件夾中!cp壞了嗎?為什麼我沒有五個不同的文件?

作為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. 兩者(*)匹配兩級子目錄名稱,我們將它們放在括號內,用於每個文件的新名稱。每個文件的新名稱是第二個參數,./files_output/$1-$2-index.html其中$1$2將是模式中括號擷取的字元串,即對子目錄名稱的反向引用。兩個參數都應該是單引號。

引用自:https://unix.stackexchange.com/questions/213649