Rename
帶重命名的遞歸複製文件
如果我的輸入文件夾
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 \;
讓它們編號,但只複製一個文件而不複製其他文件。
我不知道這會改變什麼,但我使用的是 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
將是模式中括號擷取的字元串,即對子目錄名稱的反向引用。兩個參數都應該是單引號。