將大量檔案複製到日期結構化目錄順序中

將大量檔案複製到日期結構化目錄順序中

我需要將大約 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

如何將正確的檔案複製到正確的位置?

答案1

find與的一種方式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 建立可(*)在第二個參數中使用的反向引用,如$1$2。此函數會建立目錄,然後將檔案複製到新建立的目錄中。參數(不要誤認為上面的反向引用)是:: 表示選項結束: 是必須複製的檔案 :是 目標 注意力代表
zmv-pdtcpmv
$1--

$2/var/public/voicelogging/quality_monitoring/(*)/(*).WAV'

$3/home/username/logging/${${2%_*}##*_}/$1

-n試運行;刪除它以實際運行該命令。

相關內容