將大量文件複製到日期結構化目錄順序中
我需要將大約 40.0000 個文件複製到日期結構化文件夾中。
範例文件:
/var/public/voicelogging/quality_monitoring/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV
是我需要復製到的眾多文件之一
/home/username/logging/
文件名中有兩個我需要使用的變數:
bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV
20151209
當然,日期
12434
是製作文件的使用者的 ID。我需要的是一個腳本/一個襯墊,可以在目錄中搜尋使用者 ID。
然後創建一個帶有使用者 ID 的目錄
/home/username/logging
。創建文件夾後,它需要為它可以找到的每個日期創建一個目錄。並將每個文件放入正確的
userid/date
目錄中。結果目錄的範例。
/home/username/logging/12434/20151209/bbbbbb_I_20151209-185841_xxxxxx_12434_89343.WAV
我已經建構了一個用於製作日期目錄的單線,但我仍然需要自己製作使用者 ID 目錄。
find /var/public/voicelogging/quality_monitoring/ -type f -name "*12434*" | sed -r 's/^.{65}//' | cut -c1-8 | xargs -I {} mkdir {} /home/username/logging/12434
如何將正確的文件複製到正確的位置?
find
使用and的一種方法install
:find /var/public/voicelogging/quality_monitoring -name \*.WAV -exec sh -c ' bn=${0##*/}; x=${bn%%-*}; dt=${x##*_}; y=${bn%_*}; id=${y##*_} install -D "$0" "/home/username/logging/${id}/${dt}/${bn}"' {} \;
這使用參數擴展來提取日期:
${dt}
和使用者ID:${id}
從文件名中,然後用於install
將每個文件複製到相應的userID/date
目錄(這是因為我很懶) - 沒有install
將最後一行替換為:dest=/home/username/logging/${id}/${dt}; mkdir -p "${dest}" && cp "$0" "${dest}"' {} \;
如果您更喜歡遍歷那些“日期”目錄,然後遍歷
.WAV
每個目錄中的文件:for d in /var/public/voicelogging/quality_monitoring/*; do dt=${d##*/} for f in $d/*.WAV; do bn=${f##*/}; y=${bn%_*}; id=${y##*_} dest=/home/username/logging/${id}/${dt} mkdir -p "${dest}" && cp "${f}" "${dest}" done done
如果你有
zsh
它更容易和更短zmv
(也因為zsh
更聰明,你可以嵌套變數擴展,例如${${file%_*}##*_}
足以提取使用者 ID):dtcp () { mkdir -p $3 && cp $1 $2 $3 } autoload zmv zmv -n -p dtcp '/var/public/voicelogging/quality_monitoring/(*)/(*).WAV' \ '/home/username/logging/${${2%_*}##*_}/$1'
(*)
s 創建可以在第二個參數 as 中使用的反向引用,$1
等等$2
。這裡
zmv
用 with-p
執行函式dtcp
而不是mv
。該函式創建目錄,然後將文件複製到新創建的目錄。參數(不要誤認為上面的反向引用)是:
$1
:--
這意味著選項結束
$2
:/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'
那是必須複製的文件和
$3
:/home/username/logging/${${2%_*}##*_}/$1
是目標
注意
-n
代表乾執行; 刪除它以實際執行命令。